我正在尝试理解java 中ascii数据字符串到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中显示的数据的方法。
您似乎已打包BCD,开始时7
处的37不是原始消息的一部分。
你需要做的是取每个字节的低16位,并将它们成对组合,例如将第一个值移位4。
例如
InputStream in =
OutputStream out =
for(int i, j; (i = in.read()) >= 0 && (j = in.read()) > 0;) {
out.write(((i & 0xF) << 4) + (j & 0xF));
}
我同意您已经打包了BCD,并且37不是原始数字的一部分。我会用不同的方式来解释。
您拥有的ASCII表示形式每个字符有一个字节;所有十六进制的ascii数字都是从30十六进制偏移的,所以"0"(ascii 0)由一个十六进制值为30的字节表示,"1"由31表示,"2"由32表示,等等。
压缩BCD通过将两个低有效十六进制数字放入每个字节,在每个字节中放入两个数字,因此十六进制值为35和37的ascii"57"将用57个十六进制的压缩十进制字节表示。
这里的另一个答案中给出的代码看起来基本上是正确的,但如果你不理解原理,可能会令人困惑。为了进行转换,您可以取每对ascii数字,屏蔽或以其他方式从其代表字节中删除高阶4位,并将两个低阶4位值组合为一个8位值。
完整地说,D1也不是BCD的一部分——它似乎代表等号。