什么是C#等效于struct.unpack(“21”,logfile.read(8))?

时间:2014-01-16 02:45:45

标签: c# python

我没有太多直接使用二进制文件的经验(“我现在正在尝试自学)我正在使用python示例。我知道如何在C#中读取二进制文件但是我不知道我不太明白这个python中发生了什么:

 headerparts = struct.unpack("2l", logfile.read(8))
 headerlen = headerparts[1] - headerparts[0]
 header = struct.unpack(str(headerlen)+"l", logfile.read(headerlen*4))

我假设发生的事情是它正在读取8个字节,然后使用它来计算标题的长度......我不太确定。

Python文档说明了struct.unpack:

struct.unpack(fmt,string) 根据给定的格式解压缩字符串(可能由pack(fmt,...)打包)。结果是一个元组,即使它只包含一个项目。该字符串必须包含格式所需的数据量(len(字符串)必须等于calcsize(fmt))。

我不太明白“21”是什么意思。这意味着它是一种格式,但我没有看到描述“21”的表格,我不知道它是否意味着其他东西。有人可以解释这里发生了什么和/或向我展示C#等价物吗?

2 个答案:

答案 0 :(得分:1)

不是21,而是2l意味着两个l

l表示long(请参阅struct - Format characters。)

答案 1 :(得分:0)

这就是我最终在C#中的表现:

// get bytes from file
var fileBytes = File.ReadAllBytes("parseMe.log");

// figure out the header length
var bodyLength = BitConverter.ToInt32(fileBytes, 0);
var headerLength = BitConverter.ToInt32(fileBytes, 4) - bodyLength;

// capture the header, which is an array of end index offsets
var header = new int[headerLength];

// grab the header out of the file
for (var index = 0; index < headerLength; ++index)
    header[index] = BitConverter.ToInt32(fileBytes, 8 + index * 4);