4

16 進数を読み取る関数がありますが、正しく読み取れません。多項式関数は、文字列を 16 進数ではなく 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);
4

3 に答える 3

3

String.getBytes は、デフォルトの文字エンコーディングで文字を提供します。文字列をバイトとしてエンコードする場合でも、お勧めしません (必要なエンコーディングを提供することをお勧めします)。

このページでは、16 進文字列をバイトに解析します。これを行う簡単な方法は、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]
于 2012-12-30T17:45:07.737 に答える
2

はい、String.getBytes()はASCII文字列のバイトを取得します。文字列が「0x」で始まると仮定して Integer.decode(str)を試すか、自分で先頭に追加します。

于 2012-12-30T17:39:51.890 に答える
1
byte bytes[] = str.getBytes();

上記の行は、プラットフォームのデフォルトのエンコーディングを使用して文字をバイトに変換します。したがって、ASCIIで16進文字列がA1の場合、ASCII値Aの後にASCII値1が続きます。

16進エンコーダー/デコーダーを使用して、文字列をバイトに変換します。私はGuavaが好きですが、Apachecommons-codecにも実装があります。もちろん、 Peter Lawreyの回答が示すように、独自に実装することもできます。

于 2012-12-30T17:41:50.357 に答える