gpt4 book ai didi

java - 长度可变的字节数组

转载 作者:行者123 更新时间:2023-11-30 02:42:09 27 4
gpt4 key购买 nike

我需要将数字转换为字节数组,然后再转换回数字。问题是字节数​​组的大小是可变的,所以我需要转换一个给定字节长度的数字,我想出的方法是:(Java)

private static byte[] toArray(long value, int bytes) {
byte[] res = new byte[bytes];

final int max = bytes*8;
for(int i = 1; i <= bytes; i++)
res[i - 1] = (byte) (value >> (max - 8 * i));

return res;
}

private static long toLong(byte[] value) {
long res = 0;

for (byte b : value)
res = (res << 8) | (b & 0xff);

return res;
}

这里我使用了 long,因为 8 是我们可以使用的最大字节。这种方法对于正数来说效果很好,但我似乎无法对负数进行解码。

编辑:为了测试这一点,我尝试处理值 Integer.MIN_VALUE + 1 (-2147483647) 和 4 个字节

最佳答案

After accepting this as working solution, the Asker made some further optimizations.
I have included their own
linked code below for reference :

private static long toLong(byte[] value) {
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
final byte val = (byte) (value[0] < 0 ? 0xFF : 0);

for(int i = value.length; i < Long.BYTES; i++)
buffer.put(val);

buffer.put(value);
return buffer.getLong(0);
}
<小时/>

旧答案

编辑:基于评论(更好地理解问题)

要使您的 toLong 函数同时处理负数正数,请尝试以下操作:

private static long toLong(byte[] value) 
{
long res = 0;
int tempInt = 0;
String tempStr = ""; //holds temp string Hex values

tempStr = bytesToHex(value);

if (value[0] < 0 )
{
tempInt = value.length;
for (int i=tempInt; i<8; i++) { tempStr = ("FF" + tempStr); }

res = Long.parseUnsignedLong(tempStr, 16);
}
else { res = Long.parseLong(tempStr, 16); }

return res;

}

下面是相关的 bytesToHex 函数(经过重构,可以与任何 byte[] 输入一起开箱即用...)

public static String bytesToHex(byte[] bytes)
{ String tempStr = ""; tempStr = DatatypeConverter.printHexBinary(bytes); return tempStr; }


关于java - 长度可变的字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41330615/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com