【问题标题】:How to read a binary file as 16 byte HEX segments in C#?如何在 C# 中将二进制文件读取为 16 字节 HEX 段?
【发布时间】:2019-06-26 11:48:44
【问题描述】:

我对 C# 很陌生,但我必须使用这种语言,因为它是项目的一部分。 我正在做的基本上是一个特定的文件拆分器/合并器。 当找到特定的标头时,程序将知道在哪里拆分,并且文件必须使用 16 位对齐,所以我必须将其读取为 HEX 中的“16 字节字符串”,例如

+...p......0...

必须读作

2B 00 00 00 70 00 00 00 0D 00 00 00 30 00 00 00 

由于编码/字符集问题,我不想将其读取为字符串。 你能给我什么建议?我想到的一个问题是每次读取 16 个字节可能会很慢,因为我尝试在 C++ 中做一个 fread 缓冲区,但它并不快 - 一点也不快 - 但我想不出任何其他方法来做到这一点。

【问题讨论】:

  • 您可以使用Stream.Read 方法。 Stream 已经有一个内部缓冲区
  • 谢谢。我尝试使用 FileStream 函数来实现它,它似乎可以工作,但它并不是“那么”有效。还有其他建议吗?

标签: c# hex


【解决方案1】:

这是我现在编写的代码。它有效,但我认为它没有效率。

        int byteSize = 16;
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
        {
            var buffer = new byte[byteSize]; // in this buffer I'm saving the 16 bytes read
            while (fs.Read(buffer, 0, byteSize) > 0)
            {
                string temp = System.Text.RegularExpressions.Regex.Replace(ByteArrayToHexViaLookup32(buffer), ".{2}", "$0 ");
                Console.WriteLine(temp);
            }
        }

对于十六进制转换,我使用的是我在这个网站上找到的“ByteArrayToHexViaLookup32”函数,它非常快速高效。 程序要读取的文件大约是 700-800 KB。 正则表达式仅用于控制台可见性/调试(每个字节添加一个空格),因此它不会很快出现。

我的 CPU 快速达到 30%,它在 2/3 秒内完成了这个过程,这就是为什么我说这可能不是一种有效的方法。 (我有一个 6700HQ,所以我认为在 2 Duo 上,运行这个程序的 CPU 会花费更多)

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 2013-12-06
    • 1970-01-01
    • 2013-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2011-02-21
    相关资源
    最近更新 更多