c# - 解码 UTF-16 编码的十六进制字节后得到奇怪的问号
问题描述
我正在使用BinaryReader
类的实例从文件中读取十六进制字节数组,我需要从 UTF-16 解码它。据我所知,我需要使用System.Text.Encoding.Unicode.GetString(byte[] array)
.
这就是我的代码的样子:
public static string ReadHex(string path, Int32 startOffset, Int32 endOffset, bool decode, bool utf16)
{
if (!File.Exists(path))
{
throw new FileNotFoundException($"Could not find a file in path {path}");
}
string result = "";
List<byte> bytes = new List<byte>();
BinaryReader br = new BinaryReader(File.OpenRead(path));
for (int i = startOffset; i < endOffset; i++)
{
br.BaseStream.Position = i;
bytes.Add(br.ReadByte());
}
br.Close();
if (decode && utf16)
{
result = System.Text.Encoding.Unicode.GetString(bytes.ToArray());
}
else if (decode)
{
result = System.Text.Encoding.UTF8.GetString(bytes.ToArray());
}
else
{
foreach (byte b in bytes)
{
result += b.ToString("X2");
}
}
return result;
}
它读取参数提供的给定十六进制偏移量,并在需要时对其进行解码。UTF-8 部分完美运行,为我提供了有效的解码字符串。但我的问题在于 UTF-16 部分。这是从文件中读取的数据:
4D 00 6F 00 6A 00 61 00 6E 00 67 00 20 00 41 00 42
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00
理论上,这是应该输出的:
Mojang AB
它有点工作,但有一个奇怪的是,这是编写该方法返回的字符串时输出的内容:
Mojang AB ?
这些问号出现在我放入该方法的任何 UTF-16 上。我不明白它们为什么会出现,因为传入的数据System.Text.Encoding.Unicode.GetString(byte[] array)
不包含超出它应该包含的字符串的任何内容,并且由零 ( 00
) 组成。有人知道为什么会这样吗?
解决方案
推荐阅读
- php - URL 查询字符串
- sas - SAS proc 报告 RTF 表列宽度未与指定宽度对齐
- ada - 处理表达式时如何检查 Ada 中的潜在溢出?
- java - 我将如何匹配此 Java servlet 中数据库中的用户名和密码。JDBC 和 Servlet
- asp.net-core-2.0 - 未捕获的 TypeError:signalR.httpConnection 不是构造函数
- powershell - 为什么在测试 PSCustomObject 的属性时操作数的顺序很重要
- javascript - 为什么浏览器网络在 jQuery .ajax 调用后显示所有重新加载的 javascript
- html - 子 div 没有得到父 div 的原始高度,为什么?
- html - 如何让一个孩子以两个轴为中心,其他孩子围绕它?
- django - Django Formset 问题 - POST 似乎不起作用