通过在java中移位将有符号字节数组内容转换为十进制

时间:2013-08-28 14:09:48

标签: java byte bit-shift

我有一个带有十六进制十进制值的字节数组,我使用以下代码将该数组转换为十进制值

byte[] content = message.getFieldValue( "_Decoder Message" ).data();
int[] decContent = new int[ content.length ];
int i = 0;
for ( byte b : content )
   decContent[ i++ ] = b & 0xff;

现在阵列看起来像     decContent = [01 00 05 00 00 00];

转换此数组的前2个索引并保存为int值,如下所示

 int traceIdlow = decContent[ 0 ] & 0xFF;
 int traceIdhigh = decContent[ 1 ] & 0xFF;
 int TraceId = traceIdlow | ( traceIdhigh << 8 );

最后4个索引也需要转换为int,但我对它的变化感到困惑,不管它应该是8还是16。

如何将最后4个索引转换为int值,以便根据上面的示例,该值变为

00 00 00 05 = 5 in decimal.

有什么想法吗?

谢谢

2 个答案:

答案 0 :(得分:1)

您是否在询问如何更改4个字节的顺序 来自:b0 b1 b2 b3 to:b3b2b1b0在一个int变量?

  byte[] b = {0x5, 0x44, (byte)0x7f, 0x1};      // convert to 017f4405
  int val = b[3]<<24 |  b[2]<<16 | b[1]<<8 | b[0];
  System.out.println("val="+Integer.toHexString(val)); // val=17f4405

答案 1 :(得分:1)

这样的事情:

int val = decContent[ 2 ] | (decContent[ 3 ] << 8)
  | (decContent[ 4 ] << 16) | (decContent[ 5 ] << 24);

请注意,整数始终用Java签名。如果该值未签名且可能大于Integer.MAX_VALUE,则必须将其放入long

一点点测试:

public static void main(String[] args) throws IOException {
    int[] decContent = new int[] {1,0,5,0,0,0};
    int val = decContent[ 2 ] | (decContent[ 3 ] << 8)
              | (decContent[ 4 ] << 16) | (decContent[ 5 ] << 24);
    System.out.println(val);
}

打印答案5.