当我将C#库移植到Java时,我遇到了在Java中将字符串转换为字节的问题。它转换字符串,但它不是相同的字节数组。
我在C#中使用此代码
string input = "Test ěščřžýáíé 1234";
Encoding encoding = Encoding.UTF8;
byte[] data = encoding.GetBytes(input);
Java中的代码
String input = "Test ěščřžýáíé 1234";
String encoding = "UTF8";
byte[] data = input.getBytes(encoding);
Lwft one是Java输出,右边是C#如何使Java输出与C#one相同?
答案 0 :(得分:3)
有可能,字节数组 相同。但是,如果您将它们格式化为字符串表示形式(例如,通过调试器查看),那么它们将显示不同,因为byte
数据类型在C#中被视为无符号(值0
- 255
)但是用Java签名(值-128
- 127
)。有关说明,请参阅this question和my answer。
修改:基于this answer,您可以使用以下方式在Java中打印无符号值:
byte b = -60;
System.out.println((short)(b & 0xFF)); // output: 196
答案 1 :(得分:2)
这些数组很可能是相同的。
C#和Java之间存在很大差异:在Java中,byte
未签名。
要转储,请尝试:
public void dumpBytesToStdout(final byte[] array)
{
for (final byte b: array)
System.out.printf("%02X\n", b);
}
在C#中做一个等效的转储方法(不知道怎么做,我不做C#)
或者,如果转储函数涉及大于byte的整数类型,例如int,请执行:
i & 0xff
删除符号位。请注意,如果转换为-1,则为:
1111 1111
到int,这不会给出:
0000 0000 0000 0000 0000 0000 1111 1111
但:
1111 1111 1111 1111 1111 1111 1111 1111
即,符号位是“携带”(否则,转换将产生int值255,这不是-1)