【问题标题】:C# to Java Byte ConversionC# 到 Java 字节转换
【发布时间】:2016-04-22 16:10:16
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 没有不匹配。 Java 的字节总是有符号的。值为 239 的无符号字节与值为 -17 的有符号字节表示完全相同的值。您无需执行任何转换;将接收到的数据作为一个整体处理的函数(例如,解码 MP3 文件)将正确处理您的数据。
  • 感谢您的评论。如果我将此字节写入文件并在十六进制编辑器中比较原始文件,这些文件不会有所不同吗? (我还没有测试过,所以我猜。;-))
  • 不,它们不会不同。

标签: java c# byte unsigned signed


【解决方案1】:

将二进制转换为文本时,只能将有效的字节编码转换为文本。如果您将随机数据转换为文本,任何无效代码通常会替换为 ?

简单的解决方案是避免混合文本和二进制文件,除非你真的知道自己在做什么。

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 支持消息。它只支持字节流。您必须有一个协议,该协议允许您确定消息何时开始/结束。例如您应该在实际消息之前发送消息的长度。

【讨论】:

  • 第一次运行时,这将作为第二个变量(在我的示例中为 1,长度为 9)已经告诉我以下字节是否应该是文件/文本,所以我可以如果需要转换。将数据读取为字节而不是字符对我的需求更有意义,并且在第一次测试中我得到了预期的回报。 (例如缓冲区输出:9,缓冲区输出:1,缓冲区输出:251,缓冲区输出:252 等)谢谢!
  • @RichardWhitehouse 只要消息之间有足够的时间并且它们不是太大,就会发生这种情况。如果您及时将消息更紧密地发送在一起,它们将被合并,您将与它们一起阅读。如果您的数据包较大,它将被分成多个读取。单次读取的最小大小为 1 字节。
  • 我发现以前可以一次检索多条消息,这就是我包含长度的原因。只是将它们分开并处理它们。感谢您的提醒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
相关资源
最近更新 更多