问题出在GetBufferSize
方法上,我发送的缓冲区大小为40,它返回了一个奇怪的数字54124。
为什么java的int字节码和C#的int字节码不同?
JAVA客户端
mBufferOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), UTF8)), true);
private void sendMessage(final String message) {
if (mBufferOut != null && message != null) {
try {
Log.d("_TAG", "Message length: " + Integer.toString(message.length()));
Log.d("_TAG", "Sending: " + message);
mBufferOut.print(message.length());
mBufferOut.flush();
mBufferOut.print(message);
mBufferOut.flush();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
上面的代码发送两条消息:第一条是缓冲区大小,第二条是数据本身。
C#服务器
private void Read() {
int size = GetBufferSize();
byte[] myReadBuffer = new byte[size];
int numberOfBytesRead = 0;
string str = "";
do
{
numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
str = Encoding.UTF8.GetString(myReadBuffer, 0, numberOfBytesRead);
} while (networkStream.DataAvailable);
}
private int GetBufferSize()
{
byte[] myReadBuffer = new byte[4];
int numberOfBytesRead = 0;
do
{
numberOfBytesRead = networkStream.Read(myReadBuffer, 0, myReadBuffer.Length);
} while (networkStream.DataAvailable);
if (numberOfBytesRead > 0)
{
return BitConverter.ToInt32(myReadBuffer, 0);
}
else
{
return 0;
}
}
有什么想法吗?
发布于 2018-09-22 09:14:38
很可能您遇到了有关字节顺序的问题。Java以高字节顺序存储数据,而.NET根据您的系统架构存储数据。如果您使用的是x86机器,那么您很可能正在尝试读取大端数据,就好像它是小端数据一样。在读取字节数组之前,您必须反转它
if (BitConverter.IsLittleEndian)
{
Array.Reverse(buffer);
}
https://stackoverflow.com/questions/52452644
复制相似问题