Хобрук: Ваш путь к мастерству в программировании

Различия между getBytes(UTF-8) и Encoding.UTF8.GetBytes() в С#

Я передаю данные между С# и Java, преобразовывая их в 4 этапа:

  1. в байтовый массив
  2. в строку (просто добавляя каждый байт как символ)
  3. до UTF8 байт от 4 до base64 строки

Я узнал, что преобразование java в UTF8 отличается от C #.

Я пропущу преобразование base64 в приведенном ниже коде.

Java-код:

// The result is [-26, 16, 0, 0]
byte[] bytes = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(4326).array();

StringBuilder sb = new StringBuilder(bytes.length);
for (byte currByte : bytes) {
   sb.append((char) currByte);
}

// The result is [-17, -90, -66, 16, 0, 0]
byte[] utf8Bytes = sb.toString().getBytes("UTF-8");

код С#

MemoryStream objMemoryStream = new MemoryStream();
BinaryWriter objBinaryWriter = new BinaryWriter(objMemoryStream);
objBinaryWriter.Write(4326);

// The result [230, 16, 0, 0]
byte[] objByte = objMemoryStream.ToArray();
StringBuilder objSB = new StringBuilder();
foreach (byte objCurrByte in objByte)
{
    objSB.Append((char)objCurrByte);
}
string strBytes = objSB.ToString();

objBinaryWriter.Close();
objBinaryWriter.Dispose();

// The result is [195, 166, 16, 0, 0]
var result = UTF8Encoding.UTF8.GetBytes(strBytes);

Два конечных массива различны, хотя входные массивы/строки одинаковы. (Java просто использует подписанный байт для отображения, но значения одинаковы)

Мне не разрешено изменять код С#, потому что он уже используется клиентами.

Как я могу настроить и в чем проблема в моем коде Java?

Примечание. Java удается прочитать результирующую строку base64 из С#, но затем она генерирует с теми же данными другую строку, которую С# не может правильно прочитать.

16.05.2016

Ответы:


1

У вас проблема в том, что char не имеет знака, но байт подписан. Когда вы делаете (char) -26, вы делаете (char) (-26 & 0xFFFF), что вы намеревались сделать (char) (-26 & 0xFF)

Пытаться

for (byte currByte : bytes) {
   sb.append((char) (currByte & 0xFF)); // -26 => 230 not 65510
}
16.05.2016
  • Так просто :) Я действительно проигнорировал различия между знаками и без знака. Я просто добавил 256 в своей голове и подумал, что все одинаково. Большое спасибо. 16.05.2016
  • Операции @RazizaO над byte, char и short расширяются до int во-первых, что легко пропустить, если вы используете приведение. 16.05.2016
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..