浅析java项目中遇到的大小端

      在项目解析文件过程中,解析出来的金额有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。

猜你喜欢

转载自www.cnblogs.com/zhi-yi/p/11833362.html