getBytes(" UTF-8")与C#的Encoding.UTF8.GetBytes()之间的差异

时间:2016-05-16 09:52:13

标签: java c# encoding utf-8

我在c#和&之间传递数据Java,将它们分为4个阶段:

  1. 到字节数组
  2. to string(只需将每个字节添加为字符)
  3. UTF8个字节 4到base64字符串
  4. 我发现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#无法正确读取的不同字符串..

1 个答案:

答案 0 :(得分:1)

您遇到的问题是SELECT FirstName, LastName FROM Employee A, Invoice B WHERE A.EmployeeId = B.CustomerId 是无符号的,但字节已签名。当您执行char时,您正在执行(char) -26,而您的目标是(char) (-26 & 0xFFFF)

尝试

(char) (-26 & 0xFF)