【发布时间】:2016-03-14 01:47:51
【问题描述】:
在 C# 与 Java 中将字符串转换为字节时,我遇到了不同的结果。
C#:
byte[] byteArray = Encoding.Unicode.GetBytes ("chess ¾");
for (int i = 0; i < byteArray.Length; i++)
System.Diagnostics.Debug.Write (" " + byteArray[i]);
System.Diagnostics.Debug.WriteLine("");
System.Diagnostics.Debug.WriteLine(Encoding.Unicode.GetString(byteArray));
显示:
99 0 104 0 101 0 115 0 115 0 32 0 190 0
chess ¾
Java:
byte[] byteArray = "chess ¾".getBytes("UTF-16LE");
for (int i = 0; i < byteArray.length; i++)
System.out.print(" " + (byteArray[i]<0?(-byteArray[i]+128):byteArray[i]));
System.out.println("");
System.out.println(new String(byteAppName,"UTF-16LE"));
显示:
99 0 104 0 101 0 115 0 115 0 32 0 194 0
chess ¾
注意字节数组中倒数第二个值是不同的!我的目标是加密这些数据并能够从 C# 或 Java 读取它。这种差异似乎是一个障碍。
附带说明一下,在我学会使用 Unicode(C#)/UTF-16LE(Java) 之前,我使用的是 UTF-8 ...
C#: byte[] byteArray = Encoding.UTF8.GetBytes ("chess ¾");
显示: 99 104 101 115 115 32 194 190
Java: byteArray = appName.getBytes("UTF-8");
显示: 99 104 101 115 115 32 190 194
奇怪的是,倒数第二个和最后一个字节被翻转。
最后,¾ 的 Unicode 是十进制 190 (http://www.fileformat.info/info/unicode/char/BE/index.htm),而不是十进制 194 (Â) (http://www.fileformat.info/info/unicode/char/00c2/index.htm)。
任何帮助将不胜感激。
【问题讨论】:
-
好奇 - 如果您手动将字节数组从一个字节数组放入另一个字节数组(即:尝试解码字节),您会得到什么样的输出?
-
哦,欢迎来到 StackOverflow!这是一个很好的第一个问题:)
-
好问题:在 Java 中:
byteArray = new byte[] {99, 0, 104, 0, 101, 0, 115, 0, 115, 0, 32, 0, -62, 0};显示:99 0 104 0 101 0 115 0 115 0 32 0 190 0chess  -
在 C# 中:
byte[] byteArray = new byte[] {99, 0, 104, 0, 101, 0, 115, 0, 115, 0, 32, 0, 194, 0};显示:99 0 104 0 101 0 115 0 115 0 32 0 194 0chess  -
@Chris - 感谢您的回复。非常感谢任何见解。