将一个四个字符的字符串转换为长整型

3
我想将一个四个字符的字符串(即四个字符)转换为长整型(即将它们转换为ASCII码,然后放入长整型中)。
据我所知,这是通过将第一个字符写入长整型的第一个字节,将第二个字符写入相邻的内存位置,以此类推来完成的。但我不知道如何在C++中实现这一点。
请问有人能指点我正确的方向吗?
提前致谢。

字符串是否类似于“1234”,您想要值1234,还是类似于“fgu^%”,您只想将字符代码解释为长整型字节? - Ernest Friedman-Hill
如果您想将字符串解析为长整型值,请使用 strtol。 (http://www.cplusplus.com/reference/clibrary/cstdlib/strtol/) - Vijay Mathew
3个回答

8
这是您的四个字符集合:
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_BIT8 - Lightness Races in Orbit
你再说一遍 CHAR_BIT,我就要来黑掉你的大脑;-) - Kerrek SB
Teehee。我会对答案中的 assert(CHAR_BIT == 8) 感到满意。 - Lightness Races in Orbit

1
如果您的字节在您的机器上正确排序,则可以使用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,因此它很可能也是高效的。

编辑:除非这符合您的具体要求,否则请使用其他人发布的移位和加法答案,因为它更具可移植性和安全性!


0
#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";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接