在项目解析文件过程中,解析出来的金额有2个亿,立马感觉到不对,于是想着是不是存储方式的问题。遇到的原始报文为D2000000,将其转成小端(低字节低地址)变为000000D2,正好变为可接收的范围。故得知原始报文是采用的大端存储方式。
一.为什么会有大小端之分?
在学校学C语言的时候,知道除了int【主流编译器为4个字节】 表示整型以外,还有long【长度不低于int类型】表示长整型,这就必然涉及到字节的存储顺序问题。而一个16进制数为4位,2个就有8位【一个字节】。就我遇到的0xD2000000,有4个字节,D2为低地址,高字节,靠外的00为高地址,低字节。
具体的转换细节如下:
1 public String HexStringtoDEC(String requestId) { 2 String real1 = ""; 3 String real = ""; 4 int j = 0; 5 int size = requestId.length() / 2; 6 ArrayList<String> list = new ArrayList<String>(); 7 8 for (int i = 0; i < size; i++) { 9 list.add(requestId.substring(j, j + 2)); 10 j = j + 2; 11 } 12 for (int i = list.size() - 1; i >= 0; i--) { 13 real1 = real1 + list.get(i); 14 } 15 BigInteger a = new BigInteger(real1, 16); 16 real = a.toString(); 17 return real; 18 }
比如,16进制大端字符串0x0E83E111,经过上述代码之后转换之后就是10进制299991822。