Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可逆地结合两个uint32_t';在不更改数据类型的情况下进行复制_C++_Integer_Encryption_Uint32 T - Fatal编程技术网

C++ 可逆地结合两个uint32_t';在不更改数据类型的情况下进行复制

C++ 可逆地结合两个uint32_t';在不更改数据类型的情况下进行复制,c++,integer,encryption,uint32-t,C++,Integer,Encryption,Uint32 T,我的问题是:我需要通过一个uint32_t传回两个uint32_t(因为API是如何设置的…)。我可以硬编码任何需要反转操作的其他值,但是函数之间传递的参数需要保持一个uint32\t 如果我可以将两个32位的int位转换成一个64位的int位(就像前面解释的那样),这将是微不足道的,但是编译器不喜欢这样。我也看过数学,但我不确定这是否是我在这个案例中需要的 我曾想过设置一个简单的密码:unnit32可以是密文,我可以硬编码密钥。这是一个很好的例子,但这似乎有些过头了 这可能吗?仅使用32位不可

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

如果我可以将两个32位的int位转换成一个64位的int位(就像前面解释的那样),这将是微不足道的,但是编译器不喜欢这样。我也看过数学,但我不确定这是否是我在这个案例中需要的

我曾想过设置一个简单的密码:unnit32可以是密文,我可以硬编码密钥。这是一个很好的例子,但这似乎有些过头了


这可能吗?

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


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

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


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

根据这到底值多少麻烦,您可以:

  • 创建
    std::pair
  • 将索引传递到函数中,然后“reverse”函数只在数组中查找结果
  • 编写一些代码来决定当您有一对要传递时使用哪个索引。索引不需要被任何其他人使用,而且由于数组是全局的,因此可能存在线程安全问题。实际上,您正在编写的是一个简单的内存分配器
  • 作为一种特殊情况,在具有32位数据指针的机器上,您可以分配结构并重新解释从
    uint32\t
    到的指针。所以你不需要任何全局变量

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

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

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


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

    根据这到底值多少麻烦,您可以:

  • 创建
    std::pair
  • 将索引传递到函数中,然后“reverse”函数只在数组中查找结果
  • 编写一些代码来决定当您有一对要传递时使用哪个索引。索引不需要被任何其他人使用,而且由于数组是全局的,因此可能存在线程安全问题。实际上,您正在编写的是一个简单的内存分配器
  • 作为一种特殊情况,在具有32位数据指针的机器上,您可以分配结构并重新解释从
    uint32\t
    到的指针。所以你不需要任何全局变量

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

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

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


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

    您可以使用中间全局数据结构将一对
    uint32\u t
    存储在其上,只使用
    uint32\u 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);
    }
    
    struct my\u对{
    uint32_t a,b;
    };
    std::映射全局\u对\u映射;
    uint32\u t寄存器\u新对(uint32\u t a、uint32\u t b){
    //将(a,b)对添加到新密钥上的映射全局对映射中,并返回
    //新的键值。
    }
    无效释放对(uint32密钥){
    //从全局\u对\u映射中删除密钥。
    }
    无效回调(uint32用户数据){
    my_pair&p=全局_pair_映射[用户数据];
    //将您的uint32\U t与p.a和p.b一起使用。
    }
    void main(){
    uint32\u t key=寄存器\u新\u对(数字1,数字2);
    寄存器_回调(回调,键);
    }
    
    您可以使用中间全局数据结构将一对
    uint32\u t
    存储在其上,只使用
    uint32\u 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);
    }
    
    struct my\u对{
    uint32_t a,b;
    };
    std::映射全局\u对\u映射;
    uint32\u t寄存器\u新对(uint32\u t a、uint32\u t b){
    //将(a,b)对添加到新k上的映射全局对映射