我必须为包含各种记录的特定文件构建一个编码器/解码器工具,并且这些记录有多个字段。现在我有了这些字段及其编码的描述。称为“TBCD”的一组特定编码如下:
地址是 TBCD 格式的数据;这表示如果一个地址通过一串数字“123456789”来表达自己,它会以下列形式出现在票证中:
2 1 first byte
4 3
6 5
8 7
F 9 last byte
地址的每个数字都以二进制表示,4 位。井号 (#) 编码为 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).
我在这里想念什么?