【问题标题】:Getting the wrong number when converting from byte[] to int从 byte[] 转换为 int 时得到错误的数字
【发布时间】:2011-11-14 10:46:17
【问题描述】:

我正在尝试将 int 转换为 byte[] 并再次返回,但我认为我在此过程中做错了什么。我的代码基本上是:

byte[] array = new byte[4];
array[3] = (byte) ( num & 0xFF);   
array[2] = (byte) ((num >> 8) & 0xFF);   
array[1] = (byte) ((num >> 16) & 0xFF);   
array[0] = (byte) ((num >> 24) & 0xFF);

还有:

for (int i =0; i < 4; i++) {
    num = (num << 8) + (array[i] & 0xff);
}

如果我从数字 72 开始,例如,在将其转换为字节数组并返回后,我得到的数字是 795108710。我错过了一步,还是我的字节序混淆了?感谢您的宝贵时间。

【问题讨论】:

  • 你试过用相反的edian吗?
  • 您在开始之前是否将num 初始化为0
  • 当我使用相反的字节序时,我得到的数字是 1717920815。我在开始之前将 num 初始化为 0。
  • 您不允许使用 int 的符号。提取符号。然后将数字设为绝对值
  • 你的两个代码sn-ps不匹配;您正在填写array,但从buffer 读取。 array 填充后包含什么,里面的值是什么?如果它们有意义,那么问题出在第二个 sn-p 上。

标签: java bytearray endianness


【解决方案1】:

使用ByteBuffer;它包含编码许多不同数据类型的方法,而无需担心字节序之类的问题:

ByteBuffer bb = ByteBuffer.allocate(32);
bb.putInt(index, 72);
...

int value = bb.getInt(index);

【讨论】:

  • +1:你可以用ByteBuffer.order(ByteOrder)改变字节顺序
【解决方案2】:

试试这个:

array[3]=(byte)(num & 0xFF);
array[2]=(byte)(num & 0x0000FF00);
array[1]=(byte)(num & 0x00FF0000);
array[0]=(byte)(num & 0xFF000000);

要取回它:

num=(int)(array[0]&0xFF) | (int)(array[1]&0xFF) | (int)(array[2]&0xFF) | (int)(array[3]&0xFF);

如果你愿意,也可以尝试循环:

for(int i=0; i<4; i++)
{
 num=num+(int)(array[i]&0xFF);
}

这是在 C# 中的。不确定它是否适用于 Java。但我认为,会的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多