Java - 读取十六进制字符串作为ASCII的多项式函数

时间:2012-12-30 17:33:21

标签: java

我有一个应该读取十六进制数的函数,但它没有正确读取它。多项式函数将字符串读取为ASCII而不是十六进制。

以下是正在开展工作的代码部分:

JButton button = new JButton("Calculate");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String str = textArea.getText();

                      int crc = 0xFFFF;        
                     int polynomial = 0x1021;  

                        byte bytes[] = str.getBytes();
                     for (byte b : bytes) {
                         for (int i = 0; i < 8; i++) {
                             boolean bit = ((b   >> (7-i) & 1) == 1);
                             boolean c15 = ((crc >> 15    & 1) == 1);
                             crc <<= 1;
                             if (c15 ^ bit) crc ^= polynomial;
                          }
                     }
                     crc &= 0xFFFF;
                textField.setText(""+Integer.toHexString(crc));
            }
        });
        button.setBounds(10, 245, 90, 25);
        panel.add(button);

3 个答案:

答案 0 :(得分:3)

String.getBytes为您提供具有默认字符编码的字符。如果你想将String编码为字节(建议你提供你想要的编码),就不推荐使用它。

在这个pase中,你想要将十六进制字符串解析为字节。一种简单的方法是使用BigInteger。

String hex = "CAFEBABE";
byte[] bytes = new BigInteger(hex, 16).toByteArray();
if (bytes.length > 0 && bytes[0] == 0)
    bytes = Arrays.copyOfRange(bytes, 1, bytes.length);
System.out.println(Arrays.toString(bytes));

打印

[-54, -2, -70, -66]

答案 1 :(得分:2)

是的,String.getBytes()获取ascii字符串的字节。 尝试Integer.decode(str),假设字符串以“0x”开头,或者自己添加。

答案 2 :(得分:1)

byte bytes[] = str.getBytes();

上面一行使用平台的默认编码将字符转换为字节。因此,如果它是ASCII并且您的十六进制字符串是A1,您将得到A的ASCII值,后跟ASCII值1。

使用十六进制编码器/解码器将字符串转换为字节。我喜欢Guava,但Apache commons-codec也有实现。您当然也可以将自己设为Peter Lawrey's answer节目。