В этом случае у меня есть шестнадцатеричный формат данных в массиве int, и я хочу преобразовать их в String.

сь, это не слишком глупый вопрос, я просмотрел 5 разных страниц результатов Google, но не смог ничего найти по этому поводу.

Что мне нужно сделать, это преобразовать строку, содержащую все шестнадцатеричные символы, например, в ASCII

String fileName = 

75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000

Каждый способ, который я видел, создает впечатление, что вы должны сначала поместить его в массив. Нет ли способа перебрать каждые два и преобразовать их?

Ответы на вопрос(7)

Решение Вопроса

чтобы пройти каждую пару символов в строке, преобразовать их в символ и затем ударять символ в конце строителя строки:

public static void main(String[] args) {
    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);
}

Это дает несколько строк, начинающихся со следующего:

uTorrent \ Completed \ nfsuc_ost_by_mustang \ Pendulum-9,000 Miles.mp3

Хммм ... :-)

 Matt22 мар. 2013 г., 12:27
Я знаю, что это старый вопрос, но только для информации, Гуава 14 представилBaseEncoding класс, который будет использоваться какnew String(BaseEncoding.base16().lowerCase().decode(hex), Charsets.US_ASCII) - экземпляр BaseEncoding может быть кэширован, поскольку он неизменен
 entonio22 февр. 2013 г., 17:16
Учитывая, что размер строки известен заранее, можно оптимизироватьStringBuilder держать все это или даже использовать толькоchar[], Уместно только, если это будет выполняться часто, конечно.
 Cory Klein24 янв. 2011 г., 19:46
Этот вопрос удостоен награды "Самообвиняющий вопрос года".
 James24 янв. 2011 г., 19:54
Ха-ха, но к счастью для меня, этот файл взят из когда-то живого дела, так что я в чистом виде, но я не думал, ха-ха! Хотя заставил меня смеяться :)
 James24 янв. 2011 г., 19:56
Спасибо "berry120", который помог мне загрузить! :)
String hexToAscii(String s) {
  int n = s.length();
  StringBuilder sb = new StringBuilder(n / 2);
  for (int i = 0; i < n; i += 2) {
    char a = s.charAt(i);
    char b = s.charAt(i + 1);
    sb.append((char) ((hexToInt(a) << 4) | hexToInt(b)));
  }
  return sb.toString();
}

private static int hexToInt(char ch) {
  if ('a' <= ch && ch <= 'f') { return ch - 'a' + 10; }
  if ('A' <= ch && ch <= 'F') { return ch - 'A' + 10; }
  if ('0' <= ch && ch <= '9') { return ch - '0'; }
  throw new IllegalArgumentException(String.valueOf(ch));
}
//%%%%%%%%%%%%%%%%%%%%%% HEX to ASCII %%%%%%%%%%%%%%%%%%%%%%
public String convertHexToString(String hex){

 String ascii="";
 String str;

 // Convert hex string to "even" length
 int rmd,length;
 length=hex.length();
 rmd =length % 2;
 if(rmd==1)
 hex = "0"+hex;

  // split into two characters
  for( int i=0; i<hex.length()-1; i+=2 ){

      //split the hex into pairs
      String pair = hex.substring(i, (i + 2));
      //convert hex to decimal
      int dec = Integer.parseInt(pair, 16);
      str=CheckCode(dec);
      ascii=ascii+" "+str;
  }
  return ascii;
}

public String CheckCode(int dec){
  String str;

          //convert the decimal to character
        str = Character.toString((char) dec);

      if(dec<32 || dec>126 && dec<161)
             str="n/a";  
  return str;
}

Самый простой способ сделать это сjavax.xml.bind.DatatypeConverter:

    String hex = "75546f7272656e745c436f6d706c657465645c6e667375635f6f73745f62795f6d757374616e675c50656e64756c756d2d392c303030204d696c65732e6d7033006d7033006d7033004472756d202620426173730050656e64756c756d00496e2053696c69636f00496e2053696c69636f2a3b2a0050656e64756c756d0050656e64756c756d496e2053696c69636f303038004472756d2026204261737350656e64756c756d496e2053696c69636f30303800392c303030204d696c6573203c4d757374616e673e50656e64756c756d496e2053696c69636f3030380050656e64756c756d50656e64756c756d496e2053696c69636f303038004d50330000";
    byte[] s = DatatypeConverter.parseHexBinary(hex);
    System.out.println(new String(s));
 LeHill08 сент. 2016 г., 22:34
Это решение дает те же результаты, что и принятый ответ.
 Ted Delezene25 сент. 2018 г., 00:44
в моем случае строка начиналась с 0x, и я получил исключение, которое жаловалось на недопустимые символы (в данном случае x), поэтому мне просто нужно было создать подстроку (2), чтобы исключить их. ^ _ ^

t, и я хочу преобразовать их в String.

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]));
}

насколько я понимаю, вам нужно вытащить последовательные пары шестнадцатеричных цифр, затем декодировать это двузначное шестнадцатеричное число и взять соответствующий символ:

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();

Преобразовать строковое представление шестнадцатеричного дампа в байтовый массив, используя Java?

Независимо от кодировки и т. Д. Вы можете сделатьnew String (hexStringToByteArray("75546..."));

Ваш ответ на вопрос