1

さまざまなレコードを含む特定のファイル用のエンコーダー/デコーダーツールを作成する必要があり、それらのレコードには複数のフィールドがあります。これで、これらのフィールドとそのエンコーディングについて説明しました。「TBCD」として知られるエンコーディングの特定のセットは次のとおりです。

アドレスはTBCD形式のデータです。これは、1つのアドレスが番号のチェーン「123456789」で表される場合、チケットに次の形式で表示されることを意味します。

2 1 first byte
4 3
6 5
8 7
F 9 last byte

アドレスの各桁は、4ビットの2進数で表されます。ハッシュ記号(#)はh'C'としてコード化され、アスタリスク(*)はh'B'としてコード化され、ゼロ(0)はh'0'としてコード化されます。値h'F'(バイナリ' 1111')は、アドレスの桁数が奇数の場合に入力するのに役立ちます。

これをデコードするために、私は次の関数を持っています:

public static String decodeTBCD(int field_size, byte[] field) {
    // TODO Auto-generated method stub
    if (field == null) {
        return null;
    }

    StringBuffer buffer = new StringBuffer();

    try {
        for (int i = 0; i < field_size; i++) {
            buffer.append(field[i] & 0x0F);
            if ((field[i] & 0xF0) != 0xF0)
                buffer.append((field[i] & 0xF0) >> 4);
        }
    } catch (Exception e) {
        System.out.println("INFORMATION" + "  decodeTBCD   "
                + e.getMessage());
        return null;
    }

    return buffer.toString();
}

したがって、入力バイト配列が{70、-9,1}の場合、デコードされた文字列は64710です。

今、私はこれのために同じ文字列をTBCD形式にエンコードし直す必要があります私は次のコードを書きました:

    Integer i = Integer.parseInt(buffer.toString());
    ArrayList<Integer> digitStack = new ArrayList<Integer>();
    ArrayList<StringBuilder> tbcdStack = new ArrayList<StringBuilder>();
    while (i > 0) {
        digitStack.add(i % 10);
        i = i / 10;
    }
    int j = digitStack.size();
    while (j > 0) {
        StringBuilder s = new StringBuilder(
                Integer.toBinaryString(digitStack.get(j - 1)));
        while (s.length() != 4) {
            StringBuilder builder = new StringBuilder();
            builder.append("0");
            builder.append(s);
            s = builder;
        }
        j--;
        System.out.println(" s : " + s + " " + s.length());
        tbcdStack.add(s);
    }
    if (tbcdStack.size() % 2 != 0)
        tbcdStack.add(new StringBuilder("1111"));
    System.out.println(tbcdStack);
    int iterator = 0, k = 0;
    byte[] bytes = new byte[tbcdStack.size() / 2];
    while (k < tbcdStack.size() / 2) {
        StringBuilder buf1 = new StringBuilder();
        buf1.append(tbcdStack.get(iterator + 1));
        buf1.append(tbcdStack.get(iterator));
        Byte b1 = Byte.valueOf(buf1.toString(), 2);
        System.out.println((byte) b1);
        bytes[k++] = b1;
        iterator += 2;
    }

プロセスを逆にして、デコードされた文字列からすべての数字を抽出し、数字をdigit2、digit1の順に連結して、byte {"digit2"+"digit1"}でバイト配列を作成しました。しかし、私はこれで正しい答えを得ることができません:

 DECODING : inside TBCD  70,-9,1 outside TBCD  64710  
 ENCODING : input 64710 . Individual digits : 0110, 0100, 0111, 0001, 0000, 1111  

  Result : first byte = 70 (correct) , second byte = 23 (need -9) , third byte = error (11110000 out of range).

ここで何が欠けていますか?

4

0 に答える 0