我试图理解ascii数据字符串到java中的BCD数据表示的转换逻辑
请求一些指导。
我的Ascii字符串
data : 1000000011418819=11120000000000000001
输入数据的HEX视图
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 31 30 30 30 30 30 30 30 31 31 34 31 38 38 31 39 1000000011418819
00000010 3D 31 31 31 32 30 30 30 30 30 30 30 30 30 30 30 =111200000000000
00000020 30 30 30 30 31 00001
转换后的数据(输出结果):
Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000 37 10 00 00 00 11 41 88 19 D1 11 20 00 00 00 00 7.....Aˆ.Ñ. ....
00000010 00 00 00 10 31 ....1
如何转换Java中显示的数据。
答案 0 :(得分:3)
您似乎有packed BCD,开头7
处的37不是您原始邮件的一部分。
你需要做的是取每个字节的低16位并将它们成对组合,例如将第一个值移动4。
e.g。
InputStream in =
OutputStream out =
for(int i, j; (i = in.read()) >= 0 && (j = in.read()) > 0;) {
out.write(((i & 0xF) << 4) + (j & 0xF));
}
答案 1 :(得分:1)
我同意您已打包BCD,并且37不是原始号码的一部分。我将以不同的方式解释它。
您拥有的ASCII表示每个字符有一个字节;所有ascii数字,以十六进制表示,都是30十六进制的偏移量,因此'0'(ascii 0)由一个十六进制值为30,'1'乘31,'2'乘32等的字节表示。
打包BCD通过将两个较低有效十六进制数字放入每个字节,在每个字节中放入两个数字,因此ascii“57”(十六进制值为35和37)将以57十六进制的压缩十进制字节表示
此处另一个答案中给出的代码看起来基本上是正确的,但如果您不理解该原则可能会令人困惑。为了进行转换,您可以取每对ascii数字,屏蔽掉或以其他方式从其代表字节中删除高阶4位,并将两个低阶4位值组合成一个8位值。
要完成,D1也不是BCD的一部分 - 它似乎代表等号。