在Java中将十六进制字符串转换为ASCII

在Java中将十六进制字符串转换为ASCII,java,string,ascii,hex,Java,String,Ascii,Hex,我希望这不是一个太愚蠢的问题,我已经查看了5个不同的谷歌搜索结果页面,但没有找到任何关于这方面的内容 例如,我需要将包含所有十六进制字符的字符串转换为ASCII String fileName = 75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d703300447

我希望这不是一个太愚蠢的问题,我已经查看了5个不同的谷歌搜索结果页面,但没有找到任何关于这方面的内容

例如,我需要将包含所有十六进制字符的字符串转换为ASCII

String fileName = 

75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000
我所看到的每一种情况都让人觉得你必须先把它放到一个数组中。是否没有办法循环使用这两种方法并转换它们?

请检查


不考虑编码等。您可以执行
新字符串(hextStringToByteArray(“75546…”))

只需使用for循环遍历字符串中的每两个字符,将它们转换为一个字符,然后在字符串生成器的末尾敲打该字符:

String hex = "75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000";
StringBuilder output = new StringBuilder();
for (int i = 0; i < hex.length(); i+=2) {
    String str = hex.substring(i, i+2);
    output.append((char)Integer.parseInt(str, 16));
}
System.out.println(output);
字符串十六进制="75546F7272656E745C436F6D706C657465645C6E6673375635F6F73745F62795F6D757374616E6775C50656E6475C756D2D392C303030204D69C65732E6D7033006D7033006D704472756D20262042671730506F6D6756D0536C606F4756C756D00496E20536C696F2B2A00565656E64754756C7556D4756D6706C60756D7056D70704776D70704676D707044727576D7076D707076D707076D7076D7076D6767070707070706C60706D7076D7056D7076D7056D7076D7056D7076D7076D7076D7076D7076767676D7076D7076D70F30303800392C303030204D696C6573203C4D757374616E673E50656E67356D496E2053696C69636F3030380050656E64756C756D50656E64756D496E2053696C69636F303038004D50330000”;
StringBuilder输出=新的StringBuilder();
对于(int i=0;i
或者(Java 8+),如果您觉得自己特别粗俗,请使用臭名昭著的“固定宽度字符串拆分”黑客,使您能够使用流执行一行程序:

System.out.println(Arrays
        .stream(hex.split("(?<=\\G..)")) //https://stackoverflow.com/questions/2297347/splitting-a-string-at-every-n-th-character
        .map(s -> Character.toString((char)Integer.parseInt(s, 16)))
        .collect(Collectors.joining()));
System.out.println(数组)

.stream(hex.split)((?据我所知,您需要提取连续的十六进制数字对,然后解码该2位十六进制数字并获取相应的字符:

String s = "...";
StringBuilder sb = new StringBuilder(s.length() / 2);
for (int i = 0; i < s.length(); i+=2) {
    String hex = "" + s.charAt(i) + s.charAt(i+1);
    int ival = Integer.parseInt(hex, 16);
    sb.append((char) ival);
}
String string = sb.toString();
String s=“…”;
StringBuilder sb=新的StringBuilder(s.length()/2);
对于(int i=0;i
字符串hexToAscii(字符串s){
int n=s.长度();
StringBuilder sb=新StringBuilder(n/2);
对于(int i=0;i//%HEX到ASCII%%%
公共字符串转换HEXTOSTRING(字符串十六进制){
字符串ascii=“”;
字符串str;
//将十六进制字符串转换为“偶数”长度
int rmd,长度;
长度=十六进制长度();
rmd=长度%2;
如果(rmd==1)
hex=“0”+十六进制;
//一分为二

对于(int i=0;i使用
javax.xml.bind.DatatypeConverter进行转换的最简单方法:

    String hex = "75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000";
    byte[] s = DatatypeConverter.parseHexBinary(hex);
    System.out.println(new String(s));

在本例中,我将十六进制数据格式转换为int数组,并希望将它们转换为字符串

int[] encodeHex = new int[] { 0x48, 0x65, 0x6c, 0x6c, 0x6f }; // Hello encode
for (int i = 0; i < encodeHex.length; i++) {
   System.out.print((char) (encodeHex[i]));
}
int[]encodeHex=newint[]{0x48,0x65,0x6c,0x6c,0x6f};//你好编码
对于(int i=0;i
这个问题赢得了“年度最具自证其罪性问题”奖。哈哈,这是一个很好的观点,但幸运的是,这个文件来自一个曾经发生过的案件,所以我很清楚,但我不认为哈哈!让我发笑:)谢谢你帮助我加载的“berry120”考虑到字符串的大小是预先知道的,我们可能会优化
StringBuilder
来保存所有字符串,甚至只使用
char[]
。当然,只有经常运行时才相关。我知道这是一个老问题,但仅供参考,Guava 14引入了一个类,它将像
新字符串一样使用(BaseEncoding.base16().lowerCase().decode(hex),Charsets.US_ASCII)
-BaseEncoding实例可以缓存,因为它是不可变的。此解决方案给出的结果与接受的答案相同。在我的例子中,字符串以0x开头,我遇到了一个异常,抱怨非法字符(本例中的x),所以我只需要做一个子字符串(2)排除这些^_^
    String hex = "75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000";
    byte[] s = DatatypeConverter.parseHexBinary(hex);
    System.out.println(new String(s));
int[] encodeHex = new int[] { 0x48, 0x65, 0x6c, 0x6c, 0x6f }; // Hello encode
for (int i = 0; i < encodeHex.length; i++) {
   System.out.print((char) (encodeHex[i]));
}