Java C的getBytes(“UTF-8”)和Encoding.UTF8.getBytes()之间的差异#
我在c#和Java之间传递数据,分4个阶段进行转换: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
UTF8
字节
4至base64
字符串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
}