【问题标题】:Differences between getBytes("UTF-8") and Encoding.UTF8.GetBytes() of C#C#的getBytes("UTF-8")和Encoding.UTF8.GetBytes()的区别
【发布时间】:2016-09-12 01:50:03
【问题描述】:

我在 c# 和 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");

C#代码

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 只是使用有符号字节来显示 - 但值是相同的)

我不允许更改 c# 代码,因为它已被客户端使用..

我该如何调整,我的 java 代码有什么问题?

注意:Java 设法从 c# 读取结果 base64 字符串,但随后它使用相同的数据生成不同的字符串,c# 无法正确读取..

【问题讨论】:

    标签: java c# encoding utf-8


    【解决方案1】:

    您遇到的问题是char 是无符号的,但字节是有符号的。当您执行(char) -26 时,您正在执行(char) (-26 & 0xFFFF),您的意图是(char) (-26 & 0xFF)

    试试

    for (byte currByte : bytes) {
       sb.append((char) (currByte & 0xFF)); // -26 => 230 not 65510
    }
    

    【讨论】:

    • 如此简单 :) 我真的忽略了有符号/无符号的差异。我只是在脑海中添加了 256,并认为每件事都是一样的。谢谢分配
    • @RazizaO 对bytecharshort 的操作首先扩展到int,如果使用演员表,很容易错过。
    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 2018-04-07
    • 2012-04-02
    • 2018-01-06
    • 1970-01-01
    • 2018-06-27
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多