我有一个十六进制字符串,我将其转换为 ascii ,但结果会显示带有一些特殊字符的输出。
实际字符串= adsfads 输出字符串=adsfads���
String hex = "61647366616473000000";
StringBuilder output = new StringBuilder();
for (int i = 0; i < hex.length(); i+=2) {
String str = hex.substring(i, i+2);
int decimal = Integer.parseInt(str, 16);
output.append((char)decimal);
}
System.out.println(output);
答案 0 :(得分:1)
你的代码很好。没有特别的字符显示。
再次检查您的代码。
关注此帖
Convert a String of Hex into ASCII in Java
public class Test8 {
public static void main(String []args)
{
String hex = "61647366616473000000";
StringBuilder output = new StringBuilder();
for (int i = 0; i < hex.length(); i+=2) {
String str = hex.substring(i, i+2);
int decimal = Integer.parseInt(str, 16);
output.append((char)decimal);
// System.out.println("\n");
//output.append((char)Integer.parseInt(str, 16));
}
System.out.println(output);
}
}
答案 1 :(得分:0)
答案 2 :(得分:0)
您的ASCII包含一些不可打印的字符,这就是导致问题的原因。如果您查看字符串的十六进制值&#34; adsfads&#34;等于61647366616473,你已经拍摄了&#34; 61647366616473000000&#34;,这里最后&#34; 000000&#34;不可打印的字符。如果你将从你的字符串中删除那些零,那么你将得到你的代码所需的结果。或者你也可以从字符串中替换不可打印的字符以获得适当的结果。或者你可以编写代码来检查是否ascii char不可打印,然后为其指定一些值,
public static boolean isAsciiPrintable(char ch) {
if(ch >= 32 && ch < 127)
{
return true;
}
else
//return false and do the stuff in calling method.
}
您还可以修改现有代码以获得所需的输出,如下所示
String hex = "61647366616473000000";
StringBuilder output = new StringBuilder();
for (int i = 0; i < hex.length(); i += 2) {
String str = hex.substring(i, i + 2);
int decimal = Integer.parseInt(str, 16);
output.append((char) decimal);
}
System.out.println("YourText" + output.toString().replaceAll("\\p{C}", ""));
可能有一些不可见的空白字符(如0x0200B),它们是\ p {Zs}组的一部分,它也包含空格。如果你试图过滤不应该包含任何空格的输入字符串,则字符串replaceAll(&#34; [\ p {C} \ p {Z}]&#34;,&#34;&# 34;)将起作用。