如何在Java中将整数转换为三个字节?

3

我正在尝试将一个int转换为三个表示该intbytes(大端模式)。

我确定这与按位与和位移有关。但是我不知道如何去做。

例如:

int myInt;

// some code

byte b1, b2 , b3; // b1 is most significant, then b2 then b3.

*注意,我知道int类型占用4个字节,而三个字节有可能会发生溢出或下溢的情况。
5个回答

15

获取最不重要的字节:

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开发人员。


1
实际上,您需要从int到byte进行显式转换,然后& 0xff是不必要的(而且字节是有符号的,不像C#)。 - Tom Hawtin - tackline

2

在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


2

一个int类型的数值无法放入3个字节中。不过,如果你知道这些特定的数值可以被放入3个字节中:

   byte b1 = (myInt & 0xff);
   myInt >>= 8;
   byte b2 = (myInt & 0xff);
   myInt >>= 8;
   byte b3 = (myInt & 0xff);

你把最高/最低位顺序颠倒了。 - Darron
没有必要不必要地修改myInt,就像其他答案中所示。 - Aaron Maenpaa

0
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);

这将以正确的二进制补码格式结束负数值。

附注:您可以通过以下方式检查和比较二进制表示:

Integer.toBinaryString(myInt);
Integer.toBinaryString(myIntMultiplied );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接