【问题标题】:Unsigned 16 and 64 bit integers无符号 16 位和 64 位整数
【发布时间】:2011-11-10 12:46:55
【问题描述】:

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

规范的其他相关部分。这个问题与:

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

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

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

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

【问题讨论】:

  • 在 Java 中,short 强制要求为 16 位,long 强制要求为 64 位。它们是带符号的类型,但您指定 msb 始终为 0,所以这无关紧要。这够了吗?
  • “生产”是什么意思,您想将其作为二进制数据写入流吗?将其保留为“长长度”有什么问题?
  • 是的。我必须将其写入流。我尝试发送长,但它没有工作。收件人哽咽。当其他已开发的发送者发送消息时,接收者似乎没有问题。为了清楚起见,我在我的问题中添加了一个句子。我无法更改规格。
  • @Roger:那么您需要包含有关您的应用程序产生的流的信息,与现有应用程序(有效)产生的流相比。
  • 接收方如何知道您发送的两种表示中的哪一种?

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


【解决方案1】:

如果最高有效位必须为零,则无论是有符号还是无符号,数字都是相同的(假设是二进制补码表示)。例如,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 上下文,如果参数表示一个有符号或无符号整数,它们就可以工作。)

【讨论】:

  • 谢谢一百万。我概括并发送返回:
  • int shift=8; for (int i=0; i> (shift*(n-1-i))); }
【解决方案2】:

Java 没有无符号数据类型(参见此处:http://darksleep.com/player/JavaAndUnsignedTypes.html

int 32bit,long 64bit,short 16bit

把它们都保存这么久有那么糟糕吗?

【讨论】:

  • "Java 没有无符号数据类型。"是的。我知道。这就是我面临的问题。这是应用程序中的要求。
  • @Roger:但是你说过msb总是0,所以没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-05
  • 2012-02-11
  • 2023-03-19
  • 1970-01-01
  • 2022-01-13
  • 2019-05-30
相关资源
最近更新 更多