无符号16位和64位整数

问题描述:

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

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

  • 最显著位必须为0。
  • 必须在网络字节顺序来表示。

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

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

然后我需要把长变量“长度”转换为上述两种,取决于它有多大。最后,我非常确定,当我发送长度时,我需要做一个.getBytes()。收件人将如上所述进行解释。

+2

在Java中,“short”被强制为16位,而“long”强制为64位。它们是签名类型,但是你指定msb将始终为0,所以这应该不重要。这足够吗? –

+0

您是否想将它作为二进制数据写入流中,是什么意思?将它保持为“长度”是什么问题? –

+0

是的。我必须将它写入流中。我尝试发送很长时间,但没有奏效。收件人ch咽。当其他已经开发的发送者发送时,接收者看起来没有问题。为了清晰起见,我在问题中添加了一个句子。我无法改变规格。 –

如果最高有效位必须为零,那么无论是有符号还是无符号(假设是二进制补码表示形式),数字都是相同的。因此,举例来说,具有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上下文更精确,如果参数代表是有符号或无符号整数,则它们工作。)

+0

非常感谢。我推广并发回: –

+1

int shift = 8;对于(int i = 0; i >(shift *(n-1-i))) } –

+0

评论不会很好地格式化代码。无论如何 - 它的工作。 –

Java没有无符号的数据类型(在这里看到:http://darksleep.com/player/JavaAndUnsignedTypes.html

INT有32位,长有64位,短期有16位

是如此糟糕来存储所有一样长?

+0

“Java没有未签名的数据类型”。是。我知道。这就是我面临的问题。这是应用程序的一项要求。 –

+0

@Roger:但你说msb总是0,所以没关系。 –