将 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 &amp; 0xFF将它们转换回“正值”

【讨论】:

使用“byteVal”和“byteVal & 0xFF”有区别吗?为什么,如何?他们不是一回事吗? @DavutÖzcan 假设我们有short shortVal = 255; byte byteVal = shortVal;,那么byteVal 的值就是-1。如果我执行byteVal &amp; 0xFF,那么 JVM 会执行此操作:在内部将 byteVal“转换”为 int(值为 -1),然后它执行 &amp; 位操作,0xFF 返回一个整数值(255)。总之:不是一回事(byteVal = -1 and byteVal & 0xFF = 255)【参考方案2】:

短片有 16 位信息,因此是两个字节。当您尝试使用| (b[2] &lt;&lt; 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 字节数组转换为数字的主要内容,如果未能解决你的问题,请参考以下文章

如何在C ++中将字节数组中的整数转换为数字

将 3 维字节数组转换为单字节数组 [关闭]

在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]

在 Java 中,如何将字节数组转换为十六进制数字字符串,同时保持前导零? [复制]

如何把一个byte数组的数字转换成int

将字节数组转换为 tagVARIANT 数组