java - 无符号 16 位和 64 位整数

标签 java type-conversion java-7 network-protocols primitive-types

如何在 Java 中生成 16 位无符号整数和 64 位无符号整数?这个问题与实现标准有关。我无法更改规范。

规范的其他可能相关的部分。这个问题是关于:

  • 最高有效位必须为 0。
  • 必须以网络字节序表示。

应用程序上下文:数字(以任何一种形式)表示正在发送的数据的长度。长度可大可小。我首先发现要发送的消息长度很长。

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

然后我需要将长变量“length”转换为上面两个中的任何一个,具体取决于它有多大。最后,我很确定在发送长度时需要执行 .getBytes()。收件人将按上述解释。

最佳答案

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

假设您正在写入 OutputStream 并且您对“网络顺序”的定义是最高有效字节优先,那么您需要执行如下操作:

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

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);
}

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

关于java - 无符号 16 位和 64 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7306825/

相关文章:

java - InputStream 方法中的 OutOfBoundsException

c - 如何解决c类型转换中的这个错误?

Android-sdk 管理器未显示所有包

G1 上的 Java 7 (JDK 7) 垃圾收集和文档

java - 如何指定在终端使用哪个版本的 Java?

java - 开发 Java Web 应用程序最有效的方法是什么?或者更具体地说,比如 Wicket 应用程序?

java - 使用数学和流在 Java 8 中重新映射数组

java - 一个输入分为 3 个变量

java - 如何从十六进制转换为十进制以及从十进制转换为二进制

c# - 将包含属性的上下文传递给 TypeConverter