问题是获取缓冲区大小方法,我发送了一个缓冲区大小40,它返回一些奇怪的数字54124,这为什么java int字节码与C#int字节码不同?
JAVA CLIENT
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;
}
}
有什么想法吗?
答案 0 :(得分:1)
解决方案
`return Int32.Parse(Encoding.UTF8.GetString(myReadBuffer, 0, myReadBuffer.Length))`;
问题
公共无效打印(整数)
将指定整数的字符串表示形式打印到 目标。
将Integer转换为该int的字符串表示形式,然后转换为字节。
答案 1 :(得分:0)
您可能在字节顺序方面遇到了问题。 Java将数据存储在big endian中,.NET根据您的系统体系结构存储数据。如果您使用的是x86机器,则可能正试图读取大端数据,就好像它是小端数据一样。您必须先反转字节数组,然后再读取它
if (BitConverter.IsLittleEndian)
{
Array.Reverse(buffer);
}