Как преобразовать каждый символ в строке в 8-битный int? JAVA

#java #string #type-conversion #bit

#java #строка #преобразование типов #бит

Вопрос:

Мне предложили контрольную сумму, подобную TCP, которая состоит из суммы значений (целочисленной) последовательности и поля ack, добавляемых к посимвольной сумме поля полезной нагрузки пакета (т. е. Обрабатывать каждый символ так, как если бы это было 8-битное целое число, и просто складывать их вместе).

Я предполагаю, что это будет выглядеть следующим образом:

 char[] a = data.toCharArray();
for (int i = 0; int < len; i  ) {
   ...
}
  

Хотя я довольно невежественен относительно того, как я мог бы завершить фактическое преобразование?

Мой data есть string , и я хочу просмотреть строку (преобразованную в массив символов (хотя, если есть лучший способ сделать это, дайте мне знать!)), и теперь я готов повторить, хотя, как преобразовать каждый символ в int. Затем я буду суммировать общее количество.

Комментарии:

1. просто: в вашем цикле for: int val = a[i];

2. и это преобразует текущий символ в цикле?

Ответ №1:

Поскольку строка содержит Unicode и char является двухбайтовой реализацией Unicode в формате UTF-16, возможно, было бы лучше сначала преобразовать строку в байты:

 byte[] bytes = data.getBytes(StandardCharsets.UTF_8);
data = new String(bytes, StandardCharsets.UTF_8); // Inverse.

int crc = 0;
for (byte b : bytes) {
    int n = b amp; 0xFF; // An int 0 .. 255 without sign extension
    crc ^= n;
}
  

Теперь вы можете обрабатывать любое содержимое строки в Юникоде. UTF-8 является оптимальным, когда используется достаточное количество букв ASCII, например, на китайских HTML-страницах. (Для обычного текста на китайском языке UTF-16 может быть лучше.)

Комментарии:

1. Как бы мне теперь перейти от [B@106d69c к целому числу?

2. byte это 8-битное целое число со знаком , следовательно, вы почти на месте. Я добавил пример для цикла. toString массива байтов — это просто код его типа [B (массив байтов) и адрес / дескриптор объекта @106d69c

3. Приведенный выше цикл выдает мне результат 0, я не понимаю, зачем вам использовать операнд XOR?

4. Это был просто пример, вычисления, которые я оставляю в качестве ваших усилий ( = и это поле подтверждения). Поэтому не предлагать получение результата; информация не работает.