Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java C的getBytes(“UTF-8”)和Encoding.UTF8.getBytes()之间的差异#_Java_C#_Encoding_Utf 8 - Fatal编程技术网

Java C的getBytes(“UTF-8”)和Encoding.UTF8.getBytes()之间的差异#

Java C的getBytes(“UTF-8”)和Encoding.UTF8.getBytes()之间的差异#,java,c#,encoding,utf-8,Java,C#,Encoding,Utf 8,我在c#和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(); String

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

    尽管输入数组/字符串相同,但两个端点数组是不同的。(Java仅使用带符号字节进行显示-但值相同)

    我不允许更改c代码,因为客户端已经在使用它

    如何调整,java代码中的问题是什么


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

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

    试一试


    很简单:)我真的忽略了有符号和无符号的区别。。我只是在脑子里加了256个,觉得每件事都是一样的。。谢谢allot@RazizaO首先,对
    byte
    char
    short
    的操作会扩展到
    int
    ,如果使用强制转换,很容易忽略这些操作。
    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);
    
    for (byte currByte : bytes) {
       sb.append((char) (currByte & 0xFF)); // -26 => 230 not 65510
    }