如何将u64转换为两个u32,如下所述

时间:2016-01-18 13:37:09

标签: c++ c

我遇到了一个问题,希望有人可以帮助我。

我有一个包含15个元素的字符数组,这是Imei模块的GSM个数字,我需要将此字符数组转换为两个unsigned long (u32)数字,这样当它们的时候二进制表示是连接的,它会导致字符数组中的实际unsigned long long (u64)值,即Imei number

原因是我们目前正在开发的处理器不支持u64,我们希望将此Imei号码传输到服务器进行解码。

例如。我所拥有的是

unsigned char charArray [15] = {'3','5','3','8','1','6','0','5','4','0','4','5','7','1','3'};

,十进制数353816054045713的二进制表示为1010000011100101100111000001101111001110000010001

我正在寻找的是一个通用的解决方案,它会给我两个无符号长数字,当连接时它们的二进制表示将给出Imei的十进制二进制表示。

例如82379 (10100000111001011)94316852900111000001101111001110000010001) 连接时1010000011100101100111000001101111001110000010001353816054045713

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

如果你没有任何64位无符号类型可用(真的......!?),你可以这样做:

#include <iostream>
using namespace std;

int main() {
    unsigned char charArray [15] = {'3','5','3','8','1','6','0','5','4','0','4','5','7','1','3'};
    uint32_t t1 = 0;  // Will hold the lower 32 bits
    uint32_t t2 = 0;  // Will hold the upper 32 bits
    for (int i = 0; i < 15; i++)
    {
        // Multiply t2 by 10
        t2 = t2 * 10;

        // Loop for multiplying t1 by 10 while checking for overflow
        uint32_t x = 0;
        for (int j = 0; j < 10; j++)
        {
            x = x + t1;
            if (x < t1)
            {
               // Overflow - increment t2
               t2 = t2 + 1;
            }
        }
        t1 = x;

        // Add next digit
        x = t1 + charArray[i]-'0';  // Note the subtraction of '0'
        if (x < t1)
        {
            // Overflow - increment t2
            t2 = t2 + 1;
        }
        t1 = x;
    }

    cout << t1 << " 0x" << hex << t1 << dec << endl;
    cout << t2 << " 0x" << hex << t2 << dec << endl;

    return 0;
}

这将输出:

943168529 0x38379c11
82379 0x141cb

解决方案可能表现不佳,而且 - 很可能 - 存在更好的解决方案。但是,如果性能不是问题,那么这是一个非常直接的解决方案。

如果将结果传输到另一台计算机,请注意字节顺序。

答案 1 :(得分:0)

通过将数字表示为任意精度整数,可以轻松解决此问题。当然,自己实现任意精度算法并非易事,但已经存在许多实现。

首先,从字符串构造AP整数(为了简单起见,您可能希望为空终止它)。然后将AP整数转换为所需位大小的常规整数以获得下半部分。然后将AP整数向右移动,使位数等于较低整数的大小。然后再次转换AP整数以获得更高的一半。

因此,如果您不想使用现有的AP算法实现并希望自己实现它,那么您只需要从字符串实现构造,将转换截断为常规整数和右移。

旁注:您似乎在问题中假定(unsignedlong为32位且(unsignedlong long为64位。这些都不受标准保证。如果您需要具有特定位数的整数,则可能需要使用<cstdint>类型std::int32_t

其次,不要将字符文字转换为unsigned char。只需在char数组中存储字符串。

第三,C和C ++是不同的语言。我从C ++的角度回答。 C在某些细节上可能有所不同。

答案 2 :(得分:0)

工会可以为你做这个伎俩:

host

请注意,如果要将数据传输到不同体系结构的CPU,可能仍然需要担心字符串问题。