无符号16位和64位整数
如何在Java中生成16位无符号整数和64位无符号整数?这个问题与实施标准有关。我无法改变规范。无符号16位和64位整数
规范的其他可能相关位。这个问题是关于:
- 最显著位必须为0。
- 必须在网络字节顺序来表示。
应用程序上下文:数字(以任一形式)表示正在发送的数据的长度。长度可以大或小。我已经第一次发现消息的长度要发送很长时间。
所以我开始:long length = getLength();
然后我需要把长变量“长度”转换为上述两种,取决于它有多大。最后,我非常确定,当我发送长度时,我需要做一个.getBytes()
。收件人将如上所述进行解释。
如果最高有效位必须为零,那么无论是有符号还是无符号(假设是二进制补码表示形式),数字都是相同的。因此,举例来说,具有MSB零的16位整数表示从0
到32767
(含)的数字。
假设你正在写一个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;对于(int i = 0; i
评论不会很好地格式化代码。无论如何 - 它的工作。 –
Java没有无符号的数据类型(在这里看到:http://darksleep.com/player/JavaAndUnsignedTypes.html)
INT有32位,长有64位,短期有16位
是如此糟糕来存储所有一样长?
“Java没有未签名的数据类型”。是。我知道。这就是我面临的问题。这是应用程序的一项要求。 –
@Roger:但你说msb总是0,所以没关系。 –
在Java中,“short”被强制为16位,而“long”强制为64位。它们是签名类型,但是你指定msb将始终为0,所以这应该不重要。这足够吗? –
您是否想将它作为二进制数据写入流中,是什么意思?将它保持为“长度”是什么问题? –
是的。我必须将它写入流中。我尝试发送很长时间,但没有奏效。收件人ch咽。当其他已经开发的发送者发送时,接收者看起来没有问题。为了清晰起见,我在问题中添加了一个句子。我无法改变规格。 –