【问题标题】:Java and unsigned Bytes [duplicate]Java和无符号字节[重复]
【发布时间】:2013-02-10 23:39:34
【问题描述】:

我需要使用一个无符号字节数组。我需要通过网络将某些字符发送到服务器,其中一些字符大于 127。

我有一个简化版本的下面的代码来尝试理解这个概念:

int i= 160;
byte j = (byte) i;
System.out.println((byte)i);
System.out.println(j);

这给出了一个输出: -96 -96

我需要打印 160。因为服务器期望一个字节为 160,如果它收到 -96,它不接受该值。我使用 int 的原因是,当我阅读如何解决这个问题时,我经常遇到只使用 int 的建议,但我不太明白,因为我需要我的数组是 byte 类型.

这是我发送数组的代码部分:

public boolean send(byte[] data) {
    try {
     out.write(data); // Write the data to the outStream
     out.flush();
    } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false; // Return false if the TCP Transmit failed 
// }
return false;
}

如果有人可以帮助我,我将不胜感激。

【问题讨论】:

标签: java byte unsigned


【解决方案1】:

Java 中没有符号字节和无符号字节之分。以下两种情况都会为一个字节分配相同的值:

byte i = (byte)160;
byte j = (byte)-96;

作为开发人员,您可以在打印出来时将它们视为已签名或未签名。默认打印它们有符号,但您可以通过将它们以无符号方式转换为整数来强制它们打印无符号。

System.out.println(i); // -96
System.out.println(0xff&i); // 160

如果你想知道字节如何同时表示负数和正数,请阅读two’s complement arithmetic in Java上的这篇文章

【讨论】:

    【解决方案2】:

    发送 -96 是正确的行为。有符号字节和无符号字节在打印出来时是不同的,但在位表示上没有区别,并且当它们被另一台服务器接收时它们应该没有区别。

    【讨论】:

      【解决方案3】:

      没有 System.out.println(byte)。最接近的是 System.out.println(int)。这意味着您的字节值将转换为整数。转换扩展高位,产生负数。

      以下代码将证明我的观点:

      byte[] data =
      {
          (byte)0x01,
          (byte)0x02,
          (byte)0x7F,
          (byte)0x80
      };
      
      for (byte current : data)
      {
          String output = String.format("0x%x, 0x%x", current, (int)current);
          System.out.println(output);
      }
      

      如果您想使用 System.out.println 查看您的字节值,请屏蔽掉整数值的前三个字节,如下所示:

      System.out.println(((0x000000FF & (int)current);
      

      【讨论】:

      • 哦,好吧,所以你说问题不是我的字节而是 system.print。打印正在将其转换为负数?
      • 字节转换为整数时,扩展高位。这会产生一个负整数值。
      • 这里的 0x%x 是什么?
      • 0x 只是一个文字字符串。 %x 是将字节格式化为十六进制数字的格式字符串。
      【解决方案4】:

      字节本身没有签名或未签名。当应用某些操作(例如,与 0 比较以确定符号)时,它们会被解释为这样。操作可以有符号和无符号,在 Java 中,只有有符号字节操作可用。所以你引用的代码对这个问题没有用 - 它发送字节但不做任何操作。更好地显示接收字节的代码。一种正确且方便的方法是使用 java.io.InputStream.read() 方法,该方法将字节作为 0...255 范围内的整数返回。

      【讨论】:

      • 我没有接收器/服务器的代码。我正在编写一个客户来与它交谈。我不需要对它做任何操作,只需要 = 操作符。我只想通过网络发送原始数据。
      猜你喜欢
      • 1970-01-01
      • 2018-04-07
      • 2013-03-11
      • 2013-05-12
      • 1970-01-01
      • 2017-12-03
      • 2013-07-19
      • 1970-01-01
      • 2017-06-19
      相关资源
      最近更新 更多