c - 嵌入式系统:数据大小管理(64 位主机向 32 位设备发送数据)
问题描述
我正在构建一个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
. 但标准规定如下:
因此,许多数据和指针类型在不同环境之间会有所不同(例如,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);
但是感觉不对劲...
解决方案
大概您的嵌入式设备执行服务。该服务需要一个接口。
您需要指定该接口。每个可用的命令、值、操作等都应与可接受的值范围以及错误条件下发生的情况一起记录。然后,您只需在双方都实施规范。
任何一方的位深度或数据类型都无关紧要。如果数据不符合接口要求,则必须在使用接口前进行转换。
推荐阅读
- node.js - NOT NULL 约束因批量插入而失败
- python - 为应用函数中处理的每一行创建一个计数器
- javascript - PHP-如何将 html 表格单元格值添加到 MYSQL 数据库
- java - 无法访问 servlet
- unity3d - HoloLens 的 Unity 开发
- vba - 使用权。不工作 带有组合框的编辑按钮
- wpf - 使用 SQL 表中的数据在 XAML 中进行 DataGrid 分组
- java - 如何在 IDEA IntelliJ 的嵌套项目中运行程序?
- javascript - Alfresco共享AMP结构,打包一个外部JS库,编译yuicompressor
- javascript - 两个选项卡在一个页面中切换不起作用