将 3 字节数组转换为数字
Posted
技术标签:
【中文标题】将 3 字节数组转换为数字【英文标题】:Convert 3 bytes array to number 【发布时间】:2014-07-31 12:31:54 【问题描述】:我使用以下代码将一个短数字转换为 3 字节数组:
static byte[] convertTo3ByteArray(short s)
byte[] ret = new byte[3];
ret[0] = (byte) (s & 0xff);
ret[1] = (byte) ((s >> 8) & 0xff);
ret[2] = (byte) (0x00);
return ret;
这很好用。
我在 *** 上找到了将数组转换回数字的代码:
static int convertToInt(byte[] b)
return ((b[0] << 0) | (b[1] << 8) | (b[2] << 16));
当我将 258 转换为字节数组,然后使用此代码时,它会返回 258。
但对于数字 675,此代码返回 -93。
如何更改 convertToShort 方法以恢复 675? 我想这与位移和数据丢失有关吗?还是有符号字节?
【问题讨论】:
顺便说一句:您返回int
而不是 short
。
对!我已经更改了方法名称,所以没有人会感到困惑。最后,它是 int 还是 short 对我来说并不重要,因为我关心数字。
【参考方案1】:
试试这个修改后的方法:
static int convertToShort(byte[] b)
return (((b[0] & 0xFF) << 0) | ((b[1] & 0xFF) << 8) | ((b[2] & 0xFF) << 16));
在数组中有些字节是负数,您需要在进行位移之前使用byteVal & 0xFF
将它们转换回“正值”
【讨论】:
使用“byteVal”和“byteVal & 0xFF”有区别吗?为什么,如何?他们不是一回事吗? @DavutÖzcan 假设我们有short shortVal = 255; byte byteVal = shortVal;
,那么byteVal
的值就是-1。如果我执行byteVal & 0xFF
,那么 JVM 会执行此操作:在内部将 byteVal“转换”为 int(值为 -1),然后它执行 &
位操作,0xFF 返回一个整数值(255)。总之:不是一回事(byteVal = -1 and byteVal & 0xFF = 255)【参考方案2】:
短片有 16 位信息,因此是两个字节。当您尝试使用| (b[2] << 16)
存储第三个字节时,它会超出short 位的末尾,这是一个问题。 IE。你不能做你想做的事。
【讨论】:
【参考方案3】:更改为使用 char
数据类型将解决此问题,因为它们是 Java 中唯一的无符号类型:
https://***.com/a/21089624/1590490
static char[] convertTo3ByteArray(short s)
char[] ret = new char[3];
ret[0] = (char) (s & 0xff);
ret[1] = (char) ((s >> 8) & 0xff);
ret[2] = (char) (0x00);
return ret;
static int convertToShort(char[] b)
return ((b[0]) | (b[1] << 8) | (b[2] << 16)); // the original << 0 shift does nothing
【讨论】:
以上是关于将 3 字节数组转换为数字的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]