我有一个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();
}
}
});
答案 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.创建一个函数来提取给定字符的索引位置并生成实际的十六进制数。请记住为扩展字符集编写额外的功能。
希望这会对你有所帮助。 : - )