我有一些结构要写入二进制文件。例如,它们由来自 cstdint 的整数组成uint64_t
。有没有办法将它们写入二进制文件,而不需要我手动将它们拆分为数组char
并使用fstream.write()
函数?
我天真的想法是 C++ 会发现我有一个二进制模式的文件,<<
并将整数写入该二进制文件。所以我试过这个:
#include <iostream>
#include <fstream>
#include <cstdint>
using namespace std;
int main() {
fstream file;
uint64_t myuint = 0xFFFF;
file.open("test.bin", ios::app | ios::binary);
file << myuint;
file.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,这将字符串“65535”写入文件。
我可以以某种方式告诉 fstream 切换到二进制模式,例如如何使用 更改显示格式<< std::hex
?
如果上面的所有内容都失败了,我需要一个将任意 cstdint 类型转换为 char 数组的函数。
我并不真正关心字节顺序,因为我会使用相同的程序来读取它们(在下一步中),所以它会抵消。
我正在编写用于以太网MAC的VHDL测试平台。测试平台由一个程序包和一个组合的实体+体系结构文件组成。我想从wireshark导出的二进制文件中读取测试台将发送到MAC的以太网帧。
我正在使用VHDL 2008编写代码,并且正在使用Mentor Graphics Model Technology ModelSim ALTERA vcom 10.0d编译器。
到目前为止,我发现在VHDL / modelsim中读取二进制数据的所有解决方案都使用特殊的文件格式,其中bit_vector的1位由文件中的几位表示。我希望VHDL将二进制文件读取为8位bit_vector。
到目前为止,我最近使用的是字符类型文件,在其中可以直接用二进制表示形式写8位ASCII字符。
我正在尝试编写一个matlab函数,该函数生成一个二进制文件,其中包含一系列64位随机整数.这些应该是高质量的,这就是为什么我想使用64位mersenne twister算法或更好.内置的randi()函数只能生成32位数.我之前使用以下方法生成了32位结果:
rng('shuffle', 'twister');
randi(2^32-1, 'uint32')
Run Code Online (Sandbox Code Playgroud)
但这不适用于64位.如果我没记错使用多个32位整数来生成64位随机整数是不好的做法,但如果有一个很好的解决方案我会对它开放.
为了使问题更加困难,我目前正在使用32位Windows XP机器.
我正在尝试使用具有以下原型的 ac 库中的函数:这里
int glip_get_backends(const char ***name, size_t *count);
的name
参数是问题所在。它是一个通过引用传递的 2 维字符数组。在 C 中,该函数的用法如下:
const char** name;
size_t count;
glip_get_backends(&name, &count);
for (size_t i = 0; i < count; i++) {
printf("- %s\n", name[i]);
}
Run Code Online (Sandbox Code Playgroud)
现在我想使用 ctypes 从 python 中使用这个函数。
对我来说最合乎逻辑的方法是在 python 中执行此操作:
lglip = CDLL("libglip.so")
count = c_int(0)
backends = POINTER(POINTER(c_char))
lglip.glip_get_backends(byref(backends), byref(count))
Run Code Online (Sandbox Code Playgroud)
这导致了错误消息
TypeError: byref() 参数必须是 ctypes 实例,而不是 '_ctypes.PyCPointerType'
下一个方法是使用该POINTER()
函数三次并省略byref()
,但这会导致以下错误:
ctypes.ArgumentError: 参数 1 :: 不知道如何转换参数 1
然后我从这个问题中汲取了灵感,并提出了以下内容:
lglip …
Run Code Online (Sandbox Code Playgroud)