0

我正在尝试了解在 java 中将 ascii 数据字符串转换为 BCD 数据表示的逻辑

请求一些指导。

我的ASCII字符串

 data : 1000000011418819=11120000000000000001

输入数据的十六进制视图

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中显示的数据的方法。

4

2 回答 2

3

您似乎已打包 BCD7 ,开头的 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));
}
于 2013-07-08T02:22:56.497 回答
1

我同意您已打包 BCD,并且 37 不是原始数字的一部分。我会稍微解释一下。

您拥有的 ASCII 表示每个字符有一个字节;所有十六进制的 ascii 数字都是从 30 hex 的偏移量,因此“0”(ascii 0)由十六进制值为 30 的字节表示,“1”由 31 表示,“2”由 32 表示,等等。

压缩 BCD 通过将两个较低的有效十六进制数字放入每个字节中,将两个数字放入每个字节中,因此十六进制值为 35 和 37 的 ascii“57”将用 57 十六进制的压缩十进制字节表示。

此处另一个答案中给出的代码看起来基本正确,但如果您不了解原理,可能会造成混淆。为了进行转换,您获取每对 ascii 数字,屏蔽或以其他方式从其代表字节中删除高阶 4 位,并将两个低阶 4 位值组合成一个 8 位值。

完整地说,D1 也不是 BCD 的一部分——它似乎代表等号。

于 2013-07-08T03:12:05.403 回答