我正在尝试将一个int
转换为三个表示该int
的bytes
(大端模式)。
我确定这与按位与和位移有关。但是我不知道如何去做。
例如:
int myInt;
// some code
byte b1, b2 , b3; // b1 is most significant, then b2 then b3.
*注意,我知道int类型占用4个字节,而三个字节有可能会发生溢出或下溢的情况。
我正在尝试将一个int
转换为三个表示该int
的bytes
(大端模式)。
我确定这与按位与和位移有关。但是我不知道如何去做。
例如:
int myInt;
// some code
byte b1, b2 , b3; // b1 is most significant, then b2 then b3.
获取最不重要的字节:
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进行按位与操作将返回第三个字节。
byte b1 = (myint >> 16) & 0xff;
byte b2 = (myint >> 8) & 0xff;
byte b3 = myint & 0xff;
我不确定这在Java中如何实现,因为我不是Java开发人员。
在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
一个int类型的数值无法放入3个字节中。不过,如果你知道这些特定的数值可以被放入3个字节中:
byte b1 = (myInt & 0xff);
myInt >>= 8;
byte b2 = (myInt & 0xff);
myInt >>= 8;
byte b3 = (myInt & 0xff);
int myIntMultiplied = myInt * 256;
byte b1, b2, b3;
b3 = (byte) ((myIntMultiplied >> 8) & 0xFF);
b2 = (byte) ((myIntMultiplied >> 16) & 0xFF);
b1 = (byte) ((myIntMultiplied >> 24) & 0xFF);
这将以正确的二进制补码格式结束负数值。
附注:您可以通过以下方式检查和比较二进制表示:
Integer.toBinaryString(myInt);
Integer.toBinaryString(myIntMultiplied );
& 0xff
是不必要的(而且字节是有符号的,不像C#)。 - Tom Hawtin - tackline