【发布时间】:2021-05-28 22:18:46
【问题描述】:
我正在尝试读取以二进制形式保存的游戏保存文件。具体来说,我想将所有完整字符串分别添加到数组中。我目前有这个代码:
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (BinaryReader reader = new BinaryReader(stream))
{
while (reader.BaseStream.Position != reader.BaseStream.Length)
{
Console.WriteLine(reader.ReadString() + "\n");
}
}
}
但是,可以理解的是,这是胡言乱语,因为我相信我的 while 循环一次推进 1 个字节。我怎样才能可靠地找到保存文件中的每个“实际”单词?作为参考,这是我要在十六进制编辑器中查看的信息:image。
另一个解决方案是遍历文件中的所有字节并以这种方式读取字符:
StringBuilder sBuilder = new StringBuilder();
bool inBuildState = false;
foreach (byte currByte in File.ReadAllBytes(path)) {
bool isChar = currByte >= 0x20 && currByte <= 0x7F;
if (inBuildState && !isChar) {
Console.WriteLine(sBuilder.ToString() + "\n");
sBuilder.Clear();
}
inBuildState = isChar;
if (inBuildState) sBuilder.Append((char)currByte);
}
这个解决方案效果很好,实际上并准确地返回了我需要的字符串。非常感谢@Flydog57。
【问题讨论】:
-
你的字符串是如何编码的?各种语言(比如西方、中东和东方语言)的混合很难与二进制数据区分开来。如果您的字符串都是带有空终止符的 7 位 ASCII,那么它们非常容易区分
-
这对我来说很难说(因为我不太了解)。 Here's another snippet 的纯文本文件。它看起来不是很有序(它是由虚幻引擎 4 生成的)。
-
逐字节循环。如果字节在 0x20-0x7f 范围内,则它可能是一个字符。您的程序应该有两种状态,是否在字符串中。如果您不在字符串中并且看到可能的字符,请转换为“在字符串中”并使用 StringBuilder 来构建字符串。当您看到更多可能的字符时,附加到 StringBuilder。当您看到“非字符”时,将 StringBuilder 转换为字符串并将其添加到 Word 列表中(清除 StringBuilder 以备下次使用)
-
如果您希望有人提出一个可行的解决方案,请将您的一堆二进制数据作为十六进制流发布(就像您在第一张图片中一样:
00 43 68 65 etc,但作为文本)。 -
您对文件中的字节进行迭代的想法非常有效。我已经编辑了我的帖子以显示我正在使用的代码。
标签: c# stream binaryfiles unreal-engine4