我正在尝试将一个转换int
为bytes
三个代表那个int
(大端)。
我确信它与按位和位移有关。但我不知道该怎么做。
例如:
int myInt;
// some code
byte b1, b2 , b3; // b1 is most significant, then b2 then b3.
*注意,我知道一个 int 是 4 个字节,这三个字节有可能上溢/下溢。
我正在尝试将一个转换int
为bytes
三个代表那个int
(大端)。
我确信它与按位和位移有关。但我不知道该怎么做。
例如:
int myInt;
// some code
byte b1, b2 , b3; // b1 is most significant, then b2 then b3.
*注意,我知道一个 int 是 4 个字节,这三个字节有可能上溢/下溢。
要获取最低有效字节:
b3 = myInt & 0xFF;
第二个最低有效字节:
b2 = (myInt >> 8) & 0xFF;
第三个最低有效字节:
b1 = (myInt >> 16) & 0xFF;
解释:
将值与 0xFF(二进制 11111111)按位与将返回该数字中的最低有效 8 位(位 0 到 7)。将数字向右移动 8 次会将位 8 到 15 放入位位置 0 到 7,因此与 0xFF 进行与运算将返回第二个字节。类似地,将数字向右移动 16 次会将位 16 到 23 放入位位置 0 到 7,因此与 0xFF 进行“与”运算会返回第 3 个字节。
byte b1 = (myint >> 16) & 0xff;
byte b2 = (myint >> 8) & 0xff;
byte b3 = myint & 0xff;
我不确定这在 java 中是如何保存的,我不是 java 开发人员
一个 int 不适合 3 个字节。但是,假设您知道这些特定的:
byte b1 = (myInt & 0xff);
myInt >>= 8;
byte b2 = (myInt & 0xff);
myInt >>= 8;
byte b3 = (myInt & 0xff);
在 Java 中
int myInt = 1;
byte b1,b2,b3;
b3 = (byte)(myInt & 0xFF);
b2 = (byte)((myInt >> 8) & 0xFF);
b1 = (byte)((myInt >> 16) & 0xFF);
System.out.println(b1+" "+b2+" "+b3);
输出0 0 1
Jeremy 的答案在正整数值的情况下是正确的。如果负值的转换应该是正确的,那么由于二进制补码格式(https://en.wikipedia.org/wiki/Two%27s_complement),它会稍微复杂一些。诀窍是消除有趣位(较低有效位)和“符号”位之间的差距。一种简单的方法是数字相乘。
int myIntMultiplied = myInt * 256;
byte b1, b2, b3;
b3 = (byte) ((myIntMultiplied >> 8) & 0xFF);
b2 = (byte) ((myIntMultiplied >> 16) & 0xFF);
b1 = (byte) ((myIntMultiplied >> 24) & 0xFF);
这将得到正确的负值补码格式。
PS:您可以通过这种方式检查和比较二进制表示:
Integer.toBinaryString(myInt);
Integer.toBinaryString(myIntMultiplied );