gpt4 book ai didi

java - C# 的 getBytes ("UTF-8") 和 Encoding.UTF8.GetBytes() 之间的区别

转载 作者:行者123 更新时间:2023-11-30 07:22:52 30 4
gpt4 key购买 nike

我在 C# 和 Java 之间传递数据,分 4 个阶段进行转换:

  1. 到字节数组
  2. 到字符串(只需将每个字节添加为字符)
  3. 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#代码

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);

尽管输入数组/字符串相同,但两端数组不同。 (Java 只是使用有符号字节来显示 - 但值是相同的)

我不允许更改 C# 代码,因为它已被客户端使用。

我该如何调整,我的java代码有什么问题?

注意:Java 设法从 C# 读取结果 Base64 字符串,但随后它使用相同的数据生成不同的字符串,而 C# 无法正确读取。

最佳答案

您遇到的问题是 char 未签名,但 byte 已签名。当您执行 (char) -26 时,您正在执行 (char) (-26 & 0xFFFF) ,您的意图是 (char) (-26 & 0xFF) )

尝试

for (byte currByte : bytes) {
sb.append((char) (currByte & 0xFF)); // -26 => 230 not 65510
}

关于java - C# 的 getBytes ("UTF-8") 和 Encoding.UTF8.GetBytes() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37251097/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com