有没有一种将byte[]转换为long[]的方法?

3

我是在开发一款安卓应用程序。我使用了一个静态函数,该函数接受 byte[] 作为参数。

我曾经传递一个包含36个字节的硬编码字节数组:

new byte[]{-13, 35, -92, -79, 47, -51, -57, 39, ......};

但在最新版本中,他们改变了函数的参数为long[]。因此,我无法再传递我的字节数组。

如何将保存的byte[]转换为long[],以便仍然可以使用相同的值调用此函数?

是否有从byte[]long[]的转换?据我所知,'byte[]'可以转换为long,但不能转换为长整型数组。

非常感谢任何关于此的帮助。


显然,如果我只是将它转移到长数组中,值就会改变。因为函数将停止正确地工作。问题是我无法看到库,并且他们的支持需要很长时间才能回复。 - Y2theZ
3
不清楚您使用的是哪个库和其语义。在先前版本中,数组中的每个long对应于八个字节,还是一对一的关系?请说明。 - nanofarad
如果将 new byte[] 更改为 new long[],它是否有效? - Elliott Frisch
你的问题很可能是由于扩展时发生的符号扩展引起的。既然你一开始就硬编码了这些值,那么只需更改你的硬编码数据即可解决问题。 - dsh
1
@Youssef 这是一个学习有符号和无符号整数在二进制中表示的好时机。一个字节是8位,在Java中始终是有符号的。因此,-130xF3相同,但编译器会警告您存在精度损失,因为有符号字节可以表示的最大数字是127(或0x7F)。在Java长整型中,-130xFFFFFFFFFFFFFFF3。但是,长整型可以表示0xF3243)而不会溢出并变为负数。另请参见Byte.toUnsignedLong() - dsh
显示剩余6条评论
2个回答

1

我猜你需要将4个字节转换为一个长整型。所以最简单的解决方案就是使用ByteBuffers。

long[] byteToLong(byte[] array) {
     ByteBuffer byteBuffer = ByteBuffer.wrap(array);
     LongBuffer longBuffer = byteBuffer.asLongBuffer();
     long[] result = new long[longBuffer.capacity()];
     longBuffer.get(result);
     return result;
}

注意:这会生成BigEndian值 - 不确定您的API需要什么。

0

这是一个最简单的问题,你应该在IDE中尝试过它。

    byte[] bytesArr = { 0, 6, 36, -84, 113, 125, -118, -47 };
    long[] longArr = new long[bytesArr.length];

    for (int i = 0; i < bytesArr.length; i++) {
        longArr[i] = bytesArr[i];
    }

此外,将long[]转换为byte[]是可能的,但您将失去所有不在byte范围内的值,即-128到127。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接