我想将四个字符的字符串(即四个字符)转换为长整型(即将它们转换为ASCII码,然后将它们放入长整型中)。将四个字符的字符串转换为长整数
据我所知,这是通过将第一个字符写入长字的第一个字节,将第二个字写入相邻的存储单元,等等来完成的。但我不知道如何在C++中做到这一点。
有人可以请指出我在正确的方向吗?
在此先感谢。
我想将四个字符的字符串(即四个字符)转换为长整型(即将它们转换为ASCII码,然后将它们放入长整型中)。将四个字符的字符串转换为长整数
据我所知,这是通过将第一个字符写入长字的第一个字节,将第二个字写入相邻的存储单元,等等来完成的。但我不知道如何在C++中做到这一点。
有人可以请指出我在正确的方向吗?
在此先感谢。
这是你的四个字符集:
const unsigned char buf[4] = { 'a', '0', '%', 'Q' };
现在我们组装一台32位无符号整数:
const uint32_t n = (buf[0]) | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
在这里,我认为buf[0]
是最显著之一;如果你想换个角度,只需交换指数。
让我们确认:
printf("n = 0x%08X\n", n); // we get n = 0x51253061
// Q % 0 a
重要:确保您的原始字节的缓冲区是签名,或以其他方式添加显式转换像(unsigned int)(unsigned char)(buf[i])
;否则转换操作没有明确定义。
字警告:我强烈希望在可能的诱人const uint32_t n = *(uint32_t*)(buf)
这个代数解,这是机器字节顺序依赖,将让你的编译器生气,如果你使用严格别名假设!
正如有益指出的下方,你可以尝试通过在字节的位大小不做假设更加便携:在需要
const unsigned very long int n = buf[0] |
(buf[1] << (CHAR_BIT) |
(buf[2] << (CHAR_BIT * 2) |
(buf[3] << (CHAR_BIT * 3) ;
随意编写自己的概括! (祝你好运找出适当的printf
格式字符串;-))
请确保'CHAR_BIT'是'8'! – 2011-06-16 11:35:29
再一次你说'CHAR_BIT',我会来破解你的大脑;-) – 2011-06-16 11:37:20
Teehee。我会满足于'assert(CHAR_BIT == 8)'的答案。 – 2011-06-16 11:56:14
如果你的字节是正确的顺序为您的机器上很长,然后使用memcpy,这样的事情 -
#include <cstdlib>
#include <iostream>
int main()
{
char data[] = {'a', 'b', 'c', 'd'};
long result;
std::memcpy(&result, data, 4);
std::cout << result << "\n";
}
注意这将是平台依赖于字节排序的长期内可能或可能不是你所需要的。并且4被硬编码为长整型字节的大小。你当然不会在真正的程序中硬编码4。我试过的所有编译器都在优化启用时优化了memcpy,所以它可能也很有效。
编辑:与转变并添加回答别人张贴的答案,除非这符合您的具体要求,因为它更便携和安全!
#include <string>
#include <iostream>
std::string fourCharCode_toString (int value)
{
return std::string(reinterpret_cast<const char*>(&(value)), sizeof(int));
}
int fourCharCode_toInt (const std::string & value)
{
return *(reinterpret_cast<const int*>(value.data()));
}
int main()
{
int a = 'DROW';
std::string str = fourCharCode_toString(a);
int b = fourCharCode_toInt(str);
std::cout << str << "\n";
}
是串像“1234”,和你想要的值'1234',或者是“甘草黄酮^%”,只是想和你的字符代码解释为字节长? – 2011-06-16 11:20:31
如果您想将字符串解析为长整型值,请使用'strtol'。 (http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/) – 2011-06-16 11:23:48