我遇到了一个问题,希望有人可以帮助我。
我有一个包含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)
和943168529
(00111000001101111001110000010001
)
连接时1010000011100101100111000001101111001110000010001
为353816054045713
。
非常感谢任何帮助。
答案 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算法实现并希望自己实现它,那么您只需要从字符串实现构造,将转换截断为常规整数和右移。
旁注:您似乎在问题中假定(unsigned
)long
为32位且(unsigned
)long long
为64位。这些都不受标准保证。如果您需要具有特定位数的整数,则可能需要使用<cstdint>
类型std::int32_t
。
其次,不要将字符文字转换为unsigned char
。只需在char
数组中存储字符串。
第三,C和C ++是不同的语言。我从C ++的角度回答。 C在某些细节上可能有所不同。
答案 2 :(得分:0)
工会可以为你做这个伎俩:
host
请注意,如果要将数据传输到不同体系结构的CPU,可能仍然需要担心字符串问题。