#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. Это был просто пример, вычисления, которые я оставляю в качестве ваших усилий ( = и это поле подтверждения). Поэтому не предлагать получение результата; информация не работает.