0

这是我的问题:我需要通过一个 uint32_t 传回两个 uint32_t(因为 API 的设置方式......)。我可以硬编码我需要反转操作的任何其他值,但函数之间传递的参数需要保持单个 uint32_t。

如果我可以将两个 32 位 int 移位到一个 64 位 int 中(就像这里解释的那样),这将是微不足道的,但编译器不喜欢这样。我也看过数学配对函数,但我不确定这是否是我在这种情况下需要的。

我想设置一个简单的密码: unint32_t 可以是密文,我可以硬编码密钥。这是一个例子,但这似乎有点矫枉过正。

这甚至可能吗?

4

3 回答 3

3

仅使用 32 位存储超过 32 位的信息是不可能的。这是信息论的一个基本结果。

如果您知道您只使用每个值的低 16 位,您可以将一个左移 16 位并以这种方式组合它们。但是绝对没有办法将 64 位的信息(甚至 33 位)转换为 32 位,周期。

于 2014-01-16T17:53:03.417 回答
2

根据这确实值得多少麻烦,您可以:

  1. 创建一个全局数组vectorstd::pair<uint32_t,uint32_t>
  2. 将索引传递给函数,然后您的“反向”函数只是在数组中查找结果。
  3. 编写一些代码来决定当你有一对要传递时使用哪个索引。该索引不需要被其他任何人使用,并且由于数组是全局的,因此可能存在线程安全问题。本质上,您正在编写的是一个简单的内存分配器。

作为一种特殊情况,在具有 32 位数据指针的机器上,您可以将结构和reinterpret_cast指针分配给uint32_t. 所以你不需要任何全局变量。

请注意,您需要知道您将值传递给的函数是否可能会将值存储在稍后“解码”的某个位置,在这种情况下,您遇到的资源管理问题比函数确定已完成使用更困难它返回时。

在简单的情况下,如果您编写的代码根本不需要可重入,那么您一次只需要使用一个索引。这意味着您不需要数组,只需要一个pair. 无论值如何,您都可以传递0给函数,并让解码器忽略其输入并查看全局位置。

如果这两种特殊情况都适用(32 位并且不保留值),那么您可以将pair放在堆栈上,并且即使您的代码确实需要可重入,也不要使用全局变量和动态分配。

这些都不是真正推荐的,但它可以解决您遇到的问题。

于 2014-01-16T18:00:24.007 回答
1

您可以使用中间全局数据结构来存储对uint32_t,使用您唯一uint32_t的参数作为结构上的索引:

struct my_pair {
  uint32_t a, b;
};

std::map<uint32_t, my_pair> global_pair_map;

uint32_t register_new_pair(uint32_t a, uint32_t b) {
  // Add the pair of (a, b) to the map global_pair_map on a new key, and return the
  // new key value.
}

void release_pair(uint32_t key) {
  // Remove the key from the global_pair_map.
}

void callback(uint32_t user_data) {
  my_pair& p = global_pair_map[user_data];

  // Use your pair of uint32_t with p.a, and p.b.
}

void main() {
  uint32_t key = register_new_pair(number1, number2);

  register_callback(callback, key);
}
于 2014-01-16T18:02:00.270 回答