我的问题是这样的。
我在Java中用byte进行了一些计算。在某些计算中,我在字节值中得到了我想要的结果“2a”,但在某些计算中,我得到字节值为“ffffff9a”。我只想从结果“ffffff9a”中输入“9a”值。我尝试了这个但是没有用。
byte a = (byte) b & 0xff;
其中b的值为“ffffff9a”字节值。
但是显示相同的过程就像
一样System.out.println(Integer.toHexString(b & 0xff));
我哪里错了?我能做些什么来获得我想要的价值?
由于
实际上我正在尝试将8位字符转换为gsm 7位。如果有人可以帮我解决这个问题,那也会有所帮助。字符串存储为字节数组,我必须将此字符串或8位字节转换为7位。
答案 0 :(得分:7)
Java中的byte
类型是签名。它的范围是[-128,127]。
System.out.println(Integer.toHexString(a & 0xff)); // note a, not b
即使a
类型为byte
,包含负值((byte)0x92
),也会显示“正确的值”。也就是说,(int)a == 0x92
将为false,因为int
的强制转换值为1>,为负值,而且(a & 0xff) == 0x92
为真。这是因为逐位&
将表达式提升为int
类型,同时“屏蔽掉”“符号位”(不是真正的符号位,而是两个补码的假象)。
请参阅:Java How To "Covert" Bytes
快乐的编码。
答案 1 :(得分:2)
您的初始代码为:byte a = (byte) b & 0xff;
(byte)
类型转换仅适用于b
,byte
已经是&
。 int
运算符然后将其扩展为int
,因此您从&
获得了结果“ffffff9a”。
您需要确保类型转换适用于byte a = (byte)(b & 0xff);
的结果,而不仅仅是第一个操作数:
{{1}}
注意额外的一对括号。
答案 2 :(得分:0)
//bit is zero base
public static boolean isSet(byte value, int bit)
{
int b = (int)value & 0xff;
b >>= bit;
b &= 0x01;
if( b != 0 )
{
return true;
}
return false;
}
public static byte setBit(byte value, int bit)
{
int b = (int)value;
b |= (1 << bit);
return (byte)(b & 0xff);
}
public static byte clearBit(byte value, int bit)
{
int b = (int)value;
b &= ~(1 << bit);
return (byte)(b & 0xff);
}