gpt4 book ai didi

python - C相当于Python的struct.pack?

转载 作者:行者123 更新时间:2023-11-30 16:42:23 32 4
gpt4 key购买 nike

有没有办法使用 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

最佳答案

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

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

第二,你想存储这个缓冲区,还是只是流式传输它?如果您只是通过编写已知大小的这些片段将其流式传输到文件(或其他文件),那就容易得多。如果我想将 header 放入 std::string 中,这就是我在 C++ 中所做的。如果我用 C 编写文件,这就是我要做的。只需调用 fwrite 而不是 memcpy。

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

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);

关于python - C相当于Python的struct.pack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45850687/

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