C相当于Python的struct.pack?

时间:2017-08-23 23:24:50

标签: python c struct

有没有办法用C来完成与Python函数struct.pack(...)相同的结果?我正在尝试用C编写一个最初用Python编写的代码,这段代码有一行代码:

header = (struct.pack("<L", ver) + prev_block.decode('hex')[::-1]
          + mrkl_root.decode('hex')[::-1]
          + struct.pack("<LLL", time_, bits, nonce))

我希望在C中重写。

更新

我已经提出了这个初步的C代码:

char* ver_pack;
char* prev_block_pack;
char* mkrl_root_pack;
char* time_pack;
char* bits_pack;
char* nonce_pack;
char* header = malloc(strlen(ver_pack)+strlen(prev_block_pack)+strlen(mkrl_root_pack)+strlen(time_pack)+strlen(bits_pack)+strlen(nonce_pack));
strcpy(header, ver_pack);
strcat(header, prev_block_pack);
strcat(header, mkrl_root_pack);
strcat(header, time_pack);
strcat(header, bits_pack);
strcat(header, nonce_pack);

现在我需要弄清楚标题中每个元素的值,它们是:

int ver
char* prev_block
char* mrkl_root
unsigned int time_
unsigned int bits
unsigned int nonce

1 个答案:

答案 0 :(得分:0)

第一个问题是您需要了解的是char *不是字符串类型。因为你解码十六进制,你应该期望有任何值,包括几个零。因此,您需要分别为二进制数据存储长度。

当然,在C ++中使用std :: string会更容易,它更像是python字符串(免责声明,我是一名c ++程序员)。

其次,你想存储这个缓冲区,还是只流它?如果您通过编写具有已知大小的这些片段将其传输到文件(或其他任何内容),则会更容易。如果我想将标题放在std :: string中,那就是我在c ++中所做的事情。如果我在C中编写文件,那就是我要做的。只需调用fwrite而不是memcpy。

将标头存储在内存中意味着您必须再次存储长度,因为它包含任意二进制数据,并且像以前一样,它可能将空字符作为数据的一部分。这是一个示例:

int length = sizeof(ver) + prev_block_length + mrkl_root_length + sizeof(time_) + sizeof(bits) + sizeof(nonce);
char * header = (char*)malloc(length);

char * p = header; // placeholder which we advance as we write
memcpy(p, &ver, sizeof(ver)); p += sizeof(ver);
memcpy(p, prev_block, prev_block_length); p += prev_block_length;
memcpy(p, mrkl_root, mrkl_root_length); p += mrkl_root_length;
memcpy(p, &time_, sizeof(time_)); p += sizeof(time_);
memcpy(p, &bits, sizeof(bits)); p += sizeof(bits);
memcpy(p, &nonce, sizeof(nonce)); p += sizeof(nonce);

// and eventually you must free (another good reason to just stream it)
free(header);