我需要转换整数,我在java中每个套接字发送超过4个字节。问题是,当整数超过9时,即[10, inf]我的崩溃代码。
我在这一行的说明中读到:所有多字节整数值都是用两个的互补符号按大端顺序编码的。
问题是我不知道如何编写合适的转换函数。这是我实现的一个,似乎适用于从0到9的整数。有人能帮我吗?
byte[] size_buffer = new byte[4];
for (int i = 0; i < 4; i++) {
size_buffer[i] = (byte)(msg_size >>> (i * 8));
}
我需要在java中转换每个套接字发送的超过4字节的整数。
可能不需要实际转换。
问题是当整数超过9时,即[10, inf]我的崩溃代码。
你所展示的内容中没有任何东西表明为什么会这样,尽管事实上所展示的转换是错误的。
所有多字节整数值都使用两个字节的互补符号按大端顺序进行编码。
这是Java类型int
的本机表示。您可以将int
s写入套接字的输出流,方法是将其包装在DataOutputStream
中,并使用DataOutputStream.writeInt()
。或者如果您使用NIO,则可以通过缓冲区的putInt()
方法将int
放入ByteBuffer
中。这两种方法都避免了手动将整数编码到字节数组中的需要。
但是如果你坚持自己做转换,完全手动,那么这个...
byte[] size_buffer = new byte[4];
for (int i = 0; i < 4; i++) {
size_buffer[i] = (byte)(msg_size >>> (i * 8));
}
... 以小尾数顺序而不是大尾数顺序(从最高到最低)读取字节。这将是一个正确的选择:
byte[] size_buffer = new byte[4];
for (int i = 0; i < 4; i++) {
size_buffer[i] = (byte)(msg_size >>> ((3 - i) * 8));
}
您声明您尝试了Inf
,但这不是int
值。您可以将Inf
插入的唯一数字类型是加倍
或浮动
,但尝试执行是编译器错误
此外,你写的代码片段对任何事情都不起作用——它把事情变成小端序。它对待9的方式和对待10的方式完全一样:9变成[9,0,0,0](2的补码int中是9,但是,小端序),10变成[10, 0, 0, 0]。
换句话说,您要么完全错误地分析了自己的代码,要么没有运行该代码段。
这很好:
int n = -2;
byte[] sizeBuffer = new byte[4];
for (int i = 0; i < 4; i++) {
sizeBuffer[i] = (byte)(n >>> (24 - (i * 8)));
}
将-1转换为[255,255,255,254](在java中,字节是带符号的,所以如果你试图打印它,它可能会显示为-1,-1,-2。这是一样的)-这确实是-2在2的补码big-endian中。
你可以做一个
字节缓冲
,也可以这样写。
ByteBuffer
有很好的功能:
byte[] bytes = new byte[4];
ByteBuffer.wrap(bytes)
.order(ByteOrder.BIG_ENDIAN) // make explicit
.putInt(intValue);
// bytes is now updated
ByteBuffer
JavaSE8中的文档
问题内容: 我想执行转换而不求助于某些依赖于实现的技巧。有小费吗? 问题答案: 您需要知道字节的字节序。 假设(例如@ WhiteFang34),其是一个长度为4的,然后… … 大端: 小端:
问题内容: 我有一个字节数组,其中数组中的数据实际上是短数据。字节按小端顺序排列: 3、1,-48、0,-15、0、36、1 转换为短值时会导致: 259、208、241、292 Java中是否有一种简单的方法可以将字节值转换为相应的短值?我可以编写一个仅占用每个高字节并将其移位8位,或与低字节进行移位的循环,但这会降低性能。 问题答案: 使用java.nio.ByteBuffer可以指定所需的字
问题内容: 我正在使用以下方式读取文件: 我在这里发现。可以转换为吗?将转换为会占用更多空间吗? 编辑:我的文件包含数百万个整数,例如, 100000000 200000000 .....(使用普通的int文件写入)。我读到字节缓冲区。现在,我想将其包装到IntBuffer数组中。怎么做 ?我不想将每个字节转换为int。 问题答案: 您已经在注释中说过,您希望输入数组中的四个字节对应于输出数组中的
问题内容: 我有一个接收a的函数,但是我所拥有的a是进行此转换的最佳方法是什么? 我想我可以走很长一段路,然后将其放入字符串并放入字节中,但这听起来很难看,而且我认为还有更好的方法可以做到。 问题答案: 我同意Brainstorm的方法:假设您要传递机器友好的二进制表示形式,请使用该库。OP建议可能会有一些开销。纵观源的实施,我看到它做了一些运行时的决策最大的灵活性。 对?Write()接受一个非
问题内容: 我有以下代码,我试图通过测试,但似乎无法理解Java世界中各种编码形式。 我想我的问题是:将任意字节的字节数组转换为Java字符串,然后将同一Java String转换为另一个字节数组的正确方法是什么,该字节数组将具有与原始字节相同的长度和相同的内容数组? 问题答案: 尝试特定的编码: ideone链接
我得到一个错误读数: