0

JavaでのASCIIデータ文字列からBCDデータ表現への変換ロジックを理解しようとしています

いくつかのガイダンスを要求します。

私のアスキー文字列

 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で変換する方法を教えてください。

4

2 に答える 2

3

BCDをパックしたようです。先頭の 37 は7元のメッセージの一部ではありません。

必要なことは、各バイトの下位 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表現には、1文字あたり1バイトがあります。16 進数のすべての ASCII 数値は 30 16 進数からのオフセットであるため、「0」(AS​​CII 0) は 16 進数値が 30、「1」が 31、「2」が 32 などのバイトで表されます。

パック BCD は、各バイトに下位 16 進数の 2 つを入れることで、各バイトに 2 つの数字を入れます。そのため、35 と 37 の 16 進数値を持つ ascii「57」は、57 hex のパック 10 進数バイトで表されます。

ここで別の回答に示されているコードは本質的に正しいように見えますが、原則を理解していないと混乱する可能性があります。変換するには、ASCII 数字の各ペアを取得し、それらの代表的なバイトから上位 4 ビットをマスク アウトするか、別の方法で削除し、2 つの下位 4 ビット値を 1 つの 8 ビット値に結合します。

完全を期すために、D1 も BCD の一部ではありません。等号を表しているように見えます。

于 2013-07-08T03:12:05.403 に答える