代码之家  ›  专栏  ›  技术社区  ›  Zapnologica

Java和无符号字节[重复]

  •  3
  • Zapnologica  · 技术社区  · 11 年前

    我需要使用一个无符号字节数组。我需要通过网络将某些字符发送到服务器,其中一些字符大于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;
    }
    

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

    4 回复  |  直到 6 年前
        1
  •  10
  •   Stephen Ostermiller    11 年前

    在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
  •  2
  •   Louis Wasserman    11 年前

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

        3
  •  2
  •   DwB    11 年前

    没有System.out.println(字节)。最接近的是System.out.print(int)。这意味着字节值被转换为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);
    
        4
  •  1
  •   Alexei Kaigorodov    11 年前

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