当前位置: 首页 > 知识库问答 >
问题:

如何将多字节整数值转换为4字节数组,并以大端顺序使用二者的互补符号

松洛华
2023-03-14

我需要转换整数,我在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));
}

共有3个答案

秦权
2023-03-14

我需要在java中转换每个套接字发送的超过4字节的整数。

可能不需要实际转换。

问题是当整数超过9时,即[10, inf]我的崩溃代码。

你所展示的内容中没有任何东西表明为什么会这样,尽管事实上所展示的转换是错误的。

所有多字节整数值都使用两个字节的互补符号按大端顺序进行编码。

这是Java类型int的本机表示。您可以将ints写入套接字的输出流,方法是将其包装在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));
}
蒋畅
2023-03-14

您声明您尝试了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中。

你可以做一个字节缓冲,也可以这样写。

柯升
2023-03-14

ByteBuffer有很好的功能:

byte[] bytes = new byte[4];
ByteBuffer.wrap(bytes)
        .order(ByteOrder.BIG_ENDIAN) // make explicit
        .putInt(intValue);
// bytes is now updated

ByteBufferJavaSE8中的文档

 类似资料:
  • 问题内容: 我想执行转换而不求助于某些依赖于实现的技巧。有小费吗? 问题答案: 您需要知道字节的字节序。 假设(例如@ 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链接

  • 我得到一个错误读数: