我怎么把4个字符放进一个int

How would I put 4 chars into a single int?

本文关键字:int 一个 4个 字符      更新时间:2023-10-16

我正在用c++编写一个复制GM缓冲系统,以熟悉比特等,它还不错,但我遇到了一个问题。如何将4个不同的字符压入整型?我不是比特方面的高手,我从来没用过。我不知道该怎么做。

在这个东西中,我有一个字符数组;大小为byteArraySize,当我调用抓取int函数时,它会从bufferPointer + 4bufferPointer取字节;向后正确地获取int

我在位移(lol)上读取了一个,我想我可以像位移每个字符的位i到右边。我只是不知道从哪里开始。

迂腐地说,在纯标准c++ 14或c++ 11中,您可能不能。

坦率地说,没有什么可以禁止一个假设的c++ 14实现,让所有的char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long都是相同的类型(至少是相同的内部表示),并且都是64位(或96位,或128位)和所有的sizeof 1。最近的C和c++标准要求long long至少为64位。

IIRC,一些奇怪的C实现在一些Common Lisp上面做类似的事情。

当然,在实践中并没有这样的c++ 14实现。

在实践中,在大多数实现中,char -s是8位字节(可能是signedunsigned), int -s通常是32位字(例如是std::int32_t),显然你可以编码

 inline int pack4chars(char c1, char c2, char c3, char c4) {
    return ((int)(((unsigned char)c1) << 24)
            |  (int)(((unsigned char)c2) << 16)
            |  (int)(((unsigned char)c3) << 8)
            |  (int)((unsigned char)c4));
}

转换为(unsigned char)是必要的,因为一些实现已经对char -s进行了签名,而其他实现则没有签名。

另请阅读关于字节序,序列化,htonl(3)

是的,您可以将4个char s(实际上是sizeof(int) char s)打包成一个int。你可以这样做:

unsigned int packChars(unsigned char *c)
{
  unsigned int val = u0;
  for (size_t idx = 0; idx < sizeof(unsigned int); ++idx) {
    val |= c[idx] << (idx * CHAR_BIT);
  }
}

我使用无符号类型,因为当涉及到符号位时,位移位会变得棘手。同样,上面的代码在使用的大小上也不是故意通用的:sizeof(unsigned int)给出了适合unsigned intchar单元的数量,而CHAR_BIT指定了char中的位数。

首先你应该知道,sizeof(int)不一定是4 *sizeof(char)。标准只保证sizeof(int)>= sizeof(char),仅此而已。

实际上int可以与char的大小相同(或更大),但你永远不会知道,除非你发现这一点。

一个可能的解决方案是使用一个联合,它的所有成员在内存中从相同的偏移量对齐。

的例子:

union Color
{
    std::uint32_t m_rgba;
    struct
    {
        std::uint8_t m_a;
        std::uint8_t m_b;
        std::uint8_t m_g;
        std::uint8_t m_r;
    };
};
Color white = { 0xffffffff };

相关文章: