将四个字符的字符串转换为long

时间:2011-06-16 11:16:10

标签: c++ long-integer

我想将一个四个字符的字符串(即四个字符)转换成一个长字符(即将它们转换为ASCII代码,然后将它们放入长字符串中。)

据我所知,这是通过将第一个字符写入long的第一个字节,第二个字符写入相邻的内存位置来完成的,依此类推。但我不知道如何用C ++做到这一点。

有人可以指出我正确的方向吗?

提前致谢。

3 个答案:

答案 0 :(得分: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格式字符串;-)。)

答案 1 :(得分: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,因此它也可能很有效。

编辑:转移并添加其他人发布的答案,除非这符合您的具体要求,因为它更便携,更安全!

答案 2 :(得分: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";
}