Как конвертировать ASCII в Hex - PullRequest
0 голосов
/ 04 ноября 2011

Как я могу преобразовать значения ASCII в шестнадцатеричные и двоичные значения (не их строковое представление в ASCII)?Например, как я могу преобразовать десятичное значение 26 в 0x1A?

До сих пор я пытался преобразовать, используя следующие шаги (фактический код см. Ниже):

  1. Преобразование значения в байты
  2. Преобразование каждого байта в int
  3. Преобразование каждого целого в шестнадцатеричное с помощью String.toString(intValue, radix)

Примечание. Я задавал связанный вопрос о записи шестнадцатеричных значений в файл.

Код закрытия:

(apply str
  (for [byte (.getBytes value)]
    (.replace (format "%2s" (Integer/toString (.intValue byte) 16)) " " "0")))))

Код Java:

Byte[] bytes = "26".getBytes();
for (Byte data : bytes) {
    System.out.print(String.format("%2s", Integer.toString(data.intValue(), 16)).replace(" ", "0"));
}
System.out.print("\n");

Ответы [ 4 ]

8 голосов
/ 04 ноября 2011

Шестнадцатеричные, десятичные и двоичные целые числа не являются разными вещами - есть только одно базовое представление целого числа. Единственное, что вы сказали, что пытаетесь избежать - «строковое представление ASCII» - это единственное, что отличается. Переменная всегда одна и та же, просто то, как вы ее печатаете, отличается.

Теперь, мне не совсем понятно, что вы пытаетесь сделать. Но, учитывая вышесказанное, путь понятен: если у вас есть String, преобразуйте его в int путем анализа (то есть, используя Integer.parseInt()). Затем, если вы хотите, чтобы он был напечатан в каком-либо формате, легко напечатать этот int как угодно, используя, например, спецификаторы формата printf.

3 голосов
/ 04 ноября 2011

Если вы действительно хотите шестнадцатеричные строки, то (format "%02X" n) намного проще, чем обручи, через которые вы перепрыгиваете с первой попытки.Если нет, просто напишите целочисленные значения в файл напрямую, не пытаясь преобразовать их в строку.

Что-то вроде (.write out (read-string string-representing-a-number)) должно быть достаточно.

1 голос
/ 05 ноября 2011

Вот ваши три шага, свернутые в одну строку::

(apply str (map #(format "0x%02X " %) (.getBytes (str 42))))
  • преобразовать в байты (.getBytes (str 42))
  • нет необходимости в шаге2
  • преобразуйте каждый байт в строку символов, представляющих его в шестнадцатеричном формате

, или вы можете сделать его более похожим на ваши шаги с помощью макроса "последний поток"

(->> (str 42)                    ; start with your value
     (.getBytes)                 ; put it in an array of bytes
     (map #(format "0x%02X " %)) ; make hex string representation
     (apply str))                ; optionally wrap it up in a string
1 голос
/ 04 ноября 2011
static String decimalToHex(String decimal, int minLength) {
  Long n = Long.parseLong(decimal, 10);
  // Long.toHexString formats assuming n is unsigned.
  String hex = Long.toHexString(Math.abs(n), 16);
  StringBuilder sb = new StringBuilder(minLength);
  if (n < 0) { sb.append('-'); }
  int padding = minLength - hex.length - sb.length();
  while (--padding >= 0) { sb.append('0'); }
  return sb.append(hex).toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...