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

Jon*_*Gik 3 c++ long-integer

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

据我了解,这是通过将第一个字符写入long的第一个字节,第二个字符写入相邻的内存位置来完成的,依此类推.但我不知道如何在C++中这样做.

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

提前致谢.

Ker*_* SB 8

这是你的四个字符集:

const unsigned char buf[4] = { 'a', '0', '%', 'Q' };
Run Code Online (Sandbox Code Playgroud)

现在我们组装一个32位无符号整数:

const uint32_t n = (buf[0]) | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
Run Code Online (Sandbox Code Playgroud)

在这里,我假设这buf[0]是最不重要的一个; 如果你想反过来,只需交换指数.

我们确认一下:

printf("n = 0x%08X\n", n); // we get n = 0x51253061
                           //               Q % 0 a
Run Code Online (Sandbox Code Playgroud)

重要说明:确保原始字节缓冲区是无符号的,或者添加显式的强制转换,如(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)   ;
Run Code Online (Sandbox Code Playgroud)

随意根据需要编写自己的概括!(祝你好运找出合适的printf格式字符串;-).)