Я передаю данные между С# и Java, преобразовывая их в 4 этапа:
- в байтовый массив
- в строку (просто добавляя каждый байт как символ)
- до
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 из С#, но затем она генерирует с теми же данными другую строку, которую С# не может правильно прочитать.
byte
,char
иshort
расширяются доint
во-первых, что легко пропустить, если вы используете приведение. 16.05.2016