【发布时间】:2023-03-27 15:02:01
【问题描述】:
我有两个字节数组来自(在 C# 和 Java 中)一个字符串。当我转换数组时,结果不匹配。这可能是什么原因?这个问题不是一成不变的。有时它会产生相同的结果。
C#:
[0] 148
[1] 70
[2] 38
[3] 173
[4] 249
[5] 227
[6] 183
[7] 106
[8] 57
[9] 25
[10] 181
[11] 13
[12] 192
[13] 176
[14] 128
[15] 164
Java :
0 = -108
1 = 70
2 = 38
3 = -83
4 = -7
5 = -29
6 = -73
7 = 106
8 = 57
9 = 25
10 = -75
11 = 13
12 = -64
13 = -80
14 = -128
15 = -92
C# 结果:“F&���j9�\r����
Java 结果:�F&���j9�0��
编辑:
转换器代码;
C# -
String result = UTF8Encoding.UTF8.GetString(byteArray);
Java:
String result = new String(byteArray, "UTF-8");
*Edit-2 : 真正的转换。
C# :
[0] 239
[1] 195
[2] 40
[3] 19
[4] 185
[5] 36
[6] 77
[7] 132
[8] 182
[9] 122
[11] 173
[12] 12
[13] 191
[14] 100
[15] 118
Java :
0 = -17
1 = -61
2 = 40
3 = 19
4 = -71
5 = 36
6 = 77
7 = -124
8 = -74
9 = 122
10 = -70
11 = -83
12 = 12
13 = -65
14 = 100
15 = 118
C# 结果:��(�$M��z���dv Java 结果:��(�$M��z���dv*
【问题讨论】:
-
也许一些代码可能会有所帮助...?
-
这些是相同的值,只是您似乎以不同的格式显示它们。它们在 C# 中未签名(范围 0 / 255)并在 Java 中签名(范围 -128 / +127)
-
请提供一个minimal reproducible example,它显示了结果字符串的 UTF-16 代码单元。还要指出字节的来源。如果它们不是以 UTF-8 编码的文本开头,则不应尝试将它们解码为 UTF-8。
-
@JonSkeet java : value.getBytes(Charset.forName("UTF-8")); C# : UTF8Encoding 编码器 = new UTF8Encoding();编码器.GetBytes(值); ..而且我无法更改 C# 代码。它在服务器中
-
所以你应该知道原始字符串是什么,并且你应该能够说出哪个解码出错了。请提供minimal reproducible example,这样会更容易为您提供帮助。