gpt4 book ai didi

C# FileStream.Read 不读取最后一个 block

转载 作者:太空宇宙 更新时间:2023-11-03 22:45:47 25 4
gpt4 key购买 nike

我将二进制文件逐 block 读取为十六进制。

当我使用 FileStream.Read 和 File.ReadAllBytes 时是不同的

  1. FileSteram.Read

    int limit = 0;
    if (openFileDlg.FileName.Length > 0)
    {
    fileName = openFileDlg.FileName;
    FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    fsLen = (int)fs.Length;
    int count = 0;
    limit = 100;
    byte[] read_buff = new byte[limit];
    StringBuilder sb = new StringBuilder();
    while ( (count = fs.Read(read_buff, 0, limit)) > 0)
    {
    foreach (byte b in read_buff)
    {
    sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
    }

    }
    rtxb_bin.AppendText(sb.ToString() + "\n");
    }
  2. File.ReadAllBytes

    if (openFileDlg.FileName.Length > 0)
    {
    fileName = openFileDlg.FileName;
    byte[] fileBytes = File.ReadAllBytes(fileName);
    StringBuilder sb2 = new StringBuilder();

    foreach (byte b2 in fileBytes)
    {
    sb2.Append(Convert.ToString(b2, 16).PadLeft(2, '0'));
    }
    rtxb_allbin.AppendText(sb2.ToString());
    }

情况一,结果是……

    ........04c0020f00452a00421346108129844f2138448500208020250405250043188510812e0

情况2是

      .......04c0020f00452a00421346108129844f2138448500208020250405250043188510812e044f212cc48120c24125404f2069c2c0008bff35f8f401efbd17047

FileStream.Read 在“12e0”之后不读取'44f212cc48120c24125404f2069c2c0008bff35f8f401efbd17047' 丢失

如何使用 FileStream.Read 读取所有字节?

为什么 FileStream.Read 不读取最后一个 block ?

最佳答案

很可能它看起来给你它没有读取最后一个 block 。假设您有长度为 102 的文件。循环的第一次迭代读取前 100 个字节,一切都很好。但是第二个(最后一个)会发生什么?您将两个字节读入长度为 100 的 read_buff。现在缓冲区包含最后一个 block 的 2 个字节和前一个(第一个) block 的 98 个字节,因为 Read 没有t 清除缓冲区。然后你继续:

 foreach (byte b in read_buff)
{
sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
}

结果,sb 第一个 block 有 100 个字节,最后一个 block 有 2 个字节,然后第一个 block 有 98 个字节。如果您不仔细观察,它可能看起来只是跳过了最后一个 block ,而实际上它复制了前一个 block 的一部分。

要解决此问题,请使用 count(表示实际读入缓冲区的字节数)来仅处理 read_buff 的有效部分:

for (int i = 0; i < count; i++) {
sb.Append(Convert.ToString(read_buff[i], 16).PadLeft(2, '0'));
}

关于C# FileStream.Read 不读取最后一个 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50013425/

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