【发布时间】:2021-09-14 10:02:27
【问题描述】:
我正在构建一个 32 位 嵌入式设备,外部参与者可以通过 PKCS#11 接口与之通信。
基本上有3个组件:
- 我们的嵌入式设备(仅支持 32 位)
- 主机(可能是 32 位或 64 位,不由我决定)
- 宿主库(可以编译成 32 位或 64 位)
我正在开发设备和主机库,我现在的主要问题是确保与 32 位和 64 位主机应用程序的兼容性。
pkcs11t.h 将 CK_ULONG 定义为:
/* an unsigned value, at least 32 bits long */
typedef unsigned long int CK_ULONG;
问题是long int 的大小在主机(8 字节)和我们的设备(4 字节)上不会相同。
我很想使用uint32_t 而不是unsigned long int。但the standard 声明如下:
因此,许多数据和指针类型会因环境而异(例如,CK_ULONG 有时是 32 位,有时可能是 64 位)。但是,这些细节不应该影响应用程序,假设它是使用与应用程序链接到的 Cryptoki 库一致的 Cryptoki 头文件编译的。
主机将向嵌入式设备发送请求,假设主机发送请求 ID 为0。嵌入式设备如何知道它是 32 位还是 64 位值?
所以我的问题如下:在 32 位嵌入式设备中处理 64 位数据类型的最佳方法是什么?我正在考虑在主人的图书馆里做类似的事情:
CK_ULONG data = 0x42; // user input, could be anything
#ifdef HOST_64
assert(data <= 4294967295);
#endif
send_data_to_device((uint32_t)data);
但是感觉不对……
【问题讨论】:
-
您的环境似乎定义了适当的数据类型。为什么要改变一些东西?
-
我没有得到显示的代码目的。在哪种情况下,您希望 0x42 的值无法断言小于或等于更高的值?您是否打算以某种方式在那里使用
sizeof()? -
这不是重复的,但那里的帖子可能会帮助您从其他角度看待您的问题。 stackoverflow.com/questions/46442411/…
-
what's the best way to handle 64 bits data types in a 32 bits embedded device?不?你想具体处理什么?有什么可以“处理”的?to ensure compatibility with both 32 and 64 bits host applications标准 PKCS#11 就是为此而设计的。ULONG是“至少 32 位长”,不完全是 32 位长,标准知道这一点。你为什么在乎? -
我编辑了我的帖子以(希望)更清晰。我关心这一点,因为当主机向我的嵌入式设备(比如 ULONG)发送一些数据时,我不知道我应该读取 4 字节还是 8 字节,因为嵌入式设备不知道主机是 64 位还是 32 位