如何将二进制文件头示例代码(C ++ / C#)转换为Python?

时间:2019-12-30 22:56:52

标签: c# python c++

我正在根据制造商的示例代码编写一个二进制文件来保存硬件仪器数据(Larson-Davis 831C)。我有以下示例:

C ++

string create_ldbin_header(int num_files, vector<int>& file_sizes)
{
ostringstream return_value;

int hdr1 = 'LD';
int hdr2 = 'BIN';
int hdr3 = 1;
int hdr4 = num_files;

return_value.write((char*)&hdr1, 4);
return_value.write((char*)&hdr2, 4);
return_value.write((char*)&hdr3, 4);
return_value.write((char*)&hdr4, 4);

for (int i = 0; i < num_files; ++i)
{
    return_value.write((char*)&file_sizes[i], 4);
}
return return_value.str();
}

C#的另一个版本

private void WriteLDBinHeader(BinaryWriter writer, int fileSize)
        {
            writer.Write();
            writer.Write((Int32)0x0042494E);
            writer.Write((Int32)0x00000001);
            writer.Write((Int32)1);
            writer.Write((Int32)fileSize);
        }

我在Python中做同样的尝试失败了。我尝试了多个版本,但我对struct pack不熟悉。我认为以字符串表示的格式应为{0:032b}。无论如何,我的最后一次尝试是:

hdr1 = "LD"
hdr2 = 'BIN'
hdr3 = "1"
hdr4 =str(y[0]["size"])
header = struct.pack('=iiii',hdr1,hdr2,hdr3,hdr4)

with open('instrumentFile.ldbin', 'wb') as f:
    f.write(header + r.content)

任何翻译指导将不胜感激。

2 个答案:

答案 0 :(得分:0)

尝试一下:

hdr1 = 0x00004c44  # "  LD"
hdr2 = 0x0042494e  # " BIN"
hdr3 = 1
hdr4 = int(y[0]["size"])
header = struct.pack('>iiii',hdr1,hdr2,hdr3,hdr4)

with open('instrumentFile.ldbin', 'wb') as f:
    f.write(header + r.content)

答案 1 :(得分:0)

非常有帮助...。它没有用,但是您让我有信心进行更多的迭代。我能够获得适当的工作文件,以比较十六进制转储中的下载版本,并能够解决问题。因此,最终的工作代码如下:

hdr1 = 0x00004c44  # "  LD"
hdr2 = 0x0042494e  # " BIN"
hdr3 = 0x00000001  # " Another item buried in documentation but does not match sample C++ code"
hdr4 = 1
hdr5 = 4202629
header = struct.pack('iiiii',hdr1,hdr2,hdr3,hdr4,hdr5)

with open('C:\\WJE Work\\excel\\instrumentFile.ldbin', 'wb') as f:
    f.write(header + r.content)

有趣的是,上面的hd3不在示例C ++代码中,而是在C#中。

感谢帮助!