将ASCII转换为十六进制

时间:2017-08-02 07:30:11

标签: java hex ascii data-conversion

我有一个Gui,我想将ASCII转换为Hex,但它打印出的是fffff84而不是84.这只发生在ä,ö,ü。出了什么问题?

示例输入:

ä

输出:

ffffff84

我的代码:

asciihex.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            output6.setText("");
            String hexadecimal2 = input4.getText().replace("\n", "");
            byte[] chars;
            try {
                chars = hexadecimal2.getBytes("CP850");
                StringBuffer hexa = new StringBuffer();
                for(int i = 0;i<chars.length;i++){
                    hexa.append(Integer.toHexString((int) chars[i]));
                }
                output6.append(hexa.toString());                    
            } catch (UnsupportedEncodingException e1) {

                e1.printStackTrace();
            }
        }
    });

3 个答案:

答案 0 :(得分:3)

Code page 850不是ASCII。并且[ .after[] ] | join("; ") + ";" 不是ASCII字符。您的其他字符示例也不能正常工作。

正在发生的事情是这些字符的值(以字节为单位)是负数,因为ä是Java中的签名类型。 (例如,byte是-124。)作为ä的二进制补码十六进制中的-124是0xFFFFF84。您可以通过将其添加到256来获得无符号版本,以获得132(0x84)。然后你转换为十六进制就可以了。

答案 1 :(得分:0)

您必须将无符号转换的字节值设为int,例如

hexa.append(Integer.toHexString((int) chars[i] & 0xFF));

或(Java 8)

hexa.append(Integer.toHexString(Byte.toUnsignedInt(chars[i])));

答案 2 :(得分:-1)

首先,“ä”的十六进制值不是0x84,而是0x7B。 要检查所有十六进制值,请参阅标准“ETSI TS 123 038 V14.0.0(2017-04)”。

现在对于编码部分,我已经创建了一个函数,它接受任何ASCII字符并按照给定的标准返回其十六进制值。因为我不想发布那些代码,因为它会用勺子喂食,而是我想引导你自己编写。

步骤: 1.首先参考给定的文档并理解给定的字符表。 2.创建一个列表,其中包含表中根据索引值给出的所有字符。 3.创建一个函数来提取给定字符的索引位置并生成实际的十六进制数。请记住为扩展字符集编写额外的功能。

希望这会对你有所帮助。 : - )