【问题标题】:C# read file in DWORD blocksC# 读取 DWORD 块中的文件
【发布时间】:2018-07-11 09:43:28
【问题描述】:

我正在尝试将二进制文件读入字节数组。

我需要以 DWORD 块(或 4 个字节)读取文件,并将每个块存储到字节数组的单个元素中。这是我迄今为止所取得的成就。

using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
{
    var block = new byte[4];
    while (true)
    {
       byte[] temp = new byte[4];
       fs.Read(temp, 0, 4);
       uint read = (byte)BitConverter.ToUInt32(temp, 0);
       block[0] = read???
    }
}

但是,将uint read 转换为block[0] 的元素不起作用。我似乎找不到不产生错误的方法。

感谢您的意见。

【问题讨论】:

  • 你需要一个位掩码。
  • 我的问题是:如果您需要 byte[] 表单中的 temp,为什么要将其转换为 uint?
  • 我不清楚你的描述。一个块是一个 DWORD,而您希望每个块进入一个字节数组的单个元素?这没有任何意义。请更详细地描述您想要做什么。
  • 我是否认为即使文件的每个元素都是 DWORD(4 字节小端无符号整数),每个整数的值也不会超过 255,因此你是将值提取为字节?如果是这样,您可以只使用temp[0] 的值作为您的字节值而忽略其他三个字节吗?此外,BinaryReader 类可以帮助您实现这一目标,而无需读取原始数据并 BitConvertering 它。
  • 没有多少技术帮助可以解决逻辑上的不可能,例如想要将一夸脱放入品脱罐中,或者在这里您显然想要将 4 个字节存储到一个字节中。如果这不是你想要做的,请编辑你的叙述,让你在这里的总体任务更加清晰。

标签: c# arrays filestream dword


【解决方案1】:
// read all bytes from file
var bytes = File.ReadAllBytes("data.dat");

// create an array of dwords by using 4 bytes in the file
var dwords = Enumerable.Range(0, bytes.Length / 4)
                       .Select(index => BitConverter.ToUInt32(bytes, index * 4))
                       .ToArray();

// down-casting to bytes
var dwordsAsBytes = dwords.Select(dw => (byte)dw).ToArray();

【讨论】:

  • 你也可以这样做 .Select(index => bytes[index * 4]) 因为它是无符号的,这实际上是你通过将 uint32 向下转换为一个字节所做的事情。但是,除非 uint 中的值大于 255,否则您的方法将适当。
  • 有没有办法从 dword 向下转换,将其分成 4 个单独的字节。例如uint 0xABCDEF12 => byte[] {0xAB, 0xCD, 0xEF, 0x12}?
  • @Zeller33 当然,使用BitConverter.GetBytes
猜你喜欢
  • 1970-01-01
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多