2013-08-28 18 views
0

转移到十进制我与十六进制小数的值的字节数组和我转换该数组为十进制值,使用以下代码转换签名的字节数组的内容在Java

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 traceIdlow = decContent[ 0 ] & 0xFF; 
int traceIdhigh = decContent[ 1 ] & 0xFF; 
int TraceId = traceIdlow | (traceIdhigh << 8); 

最后4个索引需要被转换为int,以及,但我感到困惑的换档是否应该8或16。

我如何转换的最后4项指标,以便根据上面的例子中值为

00 00 00 05 = 5 in decimal. 

任何想法为int值?

感谢

+0

小(但很重要)的一点:你不能转换为“十进制”,你从字节转换数值为整数尺寸。那么你就是将一些比特封装的值分解成单独的整数。 “十进制”从不进入它。 –

回答

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.

+0

试过这个,但没有为我工作 – Wearybands

+0

什么没有工作?发生了什么? – Henry

+0

我期待着5,它给了一个庞大的数字 – Wearybands

1

你问如何改变,在4个字节 的顺序:在一个int变量b3b2b1b0:B0 B1,B2,B3 什么?

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 
+0

是的,我想改变顺序 – Wearybands

+0

,并将其转换为无符号的DEC – Wearybands

+0

当字节展开为int时,需要将0xFF的AND加上去掉符号。 – NormR