无符号16位和64位整数

Rog*_*Gay 2 java network-protocols type-conversion primitive-types java-7

如何在Java中生成16位无符号整数和64位无符号整数?这个问题与实施标准有关.我无法改变规格.

规范的其他可能相关的部分.这个问题与:

  • 最重要的位必须是0.
  • 必须以网络字节顺序表示.

应用程序上下文:数字(以任一形式)表示要发送的数据的长度.长度可以大或小.我第一次发现要发送的消息长度很长.

所以我开始: long length = getLength();

然后,我需要将长变量"length"转换为上述两个中的任何一个,具体取决于它的大小.最后,我很确定.getBytes()在发送长度时我需要做一个.接收者将如上所述进行解释.

Ste*_*n C 6

如果最高有效位必须为零,则无论是有符号还是无符号,该数字都是相同的(假设为二进制补码表示).因此,例如,具有MSB零的16位整数表示从包含032767包含的数字.

假设您正在写入OutputStream并且您对"网络顺序"的定义首先是最重要的字节,那么您需要执行以下操作:

public void writeShort(OutputStream os, short s) throws IOException {
    os.write((byte) (s >> 8));
    os.write((byte) s);
}
Run Code Online (Sandbox Code Playgroud)

public void writeLong(OutputStream os, long l) throws IOException {
    os.write((byte) (l >> 56));
    os.write((byte) (l >> 48));
    os.write((byte) (l >> 40));
    os.write((byte) (l >> 32));
    os.write((byte) (l >> 24));
    os.write((byte) (l >> 16));
    os.write((byte) (l >> 8));
    os.write((byte) l);
}
Run Code Online (Sandbox Code Playgroud)

请注意,这些适用于有符号和无符号整数.(或者更准确地说,对于Java上下文,如果参数表示有符号或无符号整数,它们就可以工作.)