C# 到 Java 字节转换
C# to Java Byte Conversion
我正在尝试用 C# 构建一个 TCP 客户端,将文件(主要是 MP3)传递给 Android 应用程序,但我在无符号字节和有符号字节之间转换时遇到了很大困难。
应用程序检索到的值不匹配我做错了什么?
以下是 C# 通过 TCP 发送的数据。
new byte[] { 9, 1, 251, 252, 253, 254, 255, 254, 253, 252, 251, }
Java
while ((charsRead = in.read(buffer)) != -1)
{
serverMessage = new String(buffer).substring(0, charsRead);
serverByteMessage = serverMessage.getBytes();
for(int i = 0; i < serverByteMessage.length; i++) {
int bi = serverByteMessage[i] & 0xFF;
Log.e("TCP Client", "Item: " + serverByteMessage[i]);
Log.e("TCP Client", "Value of my test unsigned byte: " + bi);
}
}
Java输出
Item: 9
Value of my test unsigned byte: 9
Item: 1
Value of my test unsigned byte: 1
Item: -17
Value of my test unsigned byte: 239
Item: -65
Value of my test unsigned byte: 191
Item: -67
Value of my test unsigned byte: 189
Item: -17
Value of my test unsigned byte: 239
Item: -65
Value of my test unsigned byte: 191
Item: -67
Value of my test unsigned byte: 189
Item: -17
Value of my test unsigned byte: 239
Item: -65
Value of my test unsigned byte: 191
Item: -67
Value of my test unsigned byte: 189
Item: -17
Value of my test unsigned byte: 239
Item: -65
Value of my test unsigned byte: 191
Item: -67
Value of my test unsigned byte: 189
Item: -17
Value of my test unsigned byte: 239
当您将二进制文件转换为文本时,您只能将有效的字节编码转换为文本。如果将随机数据转换为文本,任何无效代码通常会替换为 ?
简单的解决方案是避免混合文本和二进制文件,除非您真的知道自己在做什么。
InputStream in = socket.getInputStream();
int bytesRead;
byte[] bytes = new bytes[512];
while((bytesRead = in.read(bytes)) > 0) {
for (int i =0; i < bytesread; i++) {
int bi = bytesRead[i] & 0xFF;
System.out.println(bi);
}
}
注意:您不能假定 TCP 支持消息。它只支持字节流。你必须有一个允许你在消息 starts/finishes 时计算出来的协议。例如您应该在实际消息之前发送消息的长度。
我正在尝试用 C# 构建一个 TCP 客户端,将文件(主要是 MP3)传递给 Android 应用程序,但我在无符号字节和有符号字节之间转换时遇到了很大困难。
应用程序检索到的值不匹配我做错了什么?
以下是 C# 通过 TCP 发送的数据。
new byte[] { 9, 1, 251, 252, 253, 254, 255, 254, 253, 252, 251, }
Java
while ((charsRead = in.read(buffer)) != -1)
{
serverMessage = new String(buffer).substring(0, charsRead);
serverByteMessage = serverMessage.getBytes();
for(int i = 0; i < serverByteMessage.length; i++) {
int bi = serverByteMessage[i] & 0xFF;
Log.e("TCP Client", "Item: " + serverByteMessage[i]);
Log.e("TCP Client", "Value of my test unsigned byte: " + bi);
}
}
Java输出
Item: 9
Value of my test unsigned byte: 9
Item: 1
Value of my test unsigned byte: 1
Item: -17
Value of my test unsigned byte: 239
Item: -65
Value of my test unsigned byte: 191
Item: -67
Value of my test unsigned byte: 189
Item: -17
Value of my test unsigned byte: 239
Item: -65
Value of my test unsigned byte: 191
Item: -67
Value of my test unsigned byte: 189
Item: -17
Value of my test unsigned byte: 239
Item: -65
Value of my test unsigned byte: 191
Item: -67
Value of my test unsigned byte: 189
Item: -17
Value of my test unsigned byte: 239
Item: -65
Value of my test unsigned byte: 191
Item: -67
Value of my test unsigned byte: 189
Item: -17
Value of my test unsigned byte: 239
当您将二进制文件转换为文本时,您只能将有效的字节编码转换为文本。如果将随机数据转换为文本,任何无效代码通常会替换为 ?
简单的解决方案是避免混合文本和二进制文件,除非您真的知道自己在做什么。
InputStream in = socket.getInputStream();
int bytesRead;
byte[] bytes = new bytes[512];
while((bytesRead = in.read(bytes)) > 0) {
for (int i =0; i < bytesread; i++) {
int bi = bytesRead[i] & 0xFF;
System.out.println(bi);
}
}
注意:您不能假定 TCP 支持消息。它只支持字节流。你必须有一个允许你在消息 starts/finishes 时计算出来的协议。例如您应该在实际消息之前发送消息的长度。