如何将4个字符放入单个int中?

时间:2015-09-12 17:00:25

标签: c++ bit-shift

我正在使用C ++中的副本GM缓冲系统来熟悉位等等,这也不错,但我遇到了一个问题。如何将4个不同的字符推入int?我不是最好的按位,我从来没用过它。我不知道怎么做。

在这件事中,我有一系列的字符;大小byteArraySize,当我调用grab int函数时,它将从bufferPointer + 4bufferPointer的字节数;向后以正确地抓住int。

我在bitshifting(lol)上读了,我想我可以将每个char的位i向右移位。我不知道从哪里开始。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

讽刺的是,在纯标准C ++ 14或C ++ 11中,你可能不会。

AFAIK,没有任何内容禁止假设的C ++ 14实现拥有... new ParseFile("nameofvideo.mp4", videoBytes); charshortunsigned shortint,{{ 1}},unsigned intlongunsigned long是相同的类型(至少是相同的内部表示),并且都是64位,(或96位,或128位)以及所有long long 1.最近的C和C ++标准规定unsigned long long至少有64位。

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

但是,当然,实际上没有这样的C ++ 14实现。

实际上,在大多数实现中,sizeof - s是8位字节(也许long long可能char)和signed - s通常是32位字(例如是unsigned),你显然可以编码

int

需要强制转换为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)); } - s而其他实现已签名。

另请阅读endiannessserializationhtonl(3)

答案 1 :(得分:1)

是的,您可以将4 char个(实际为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)为您提供适合char的{​​{1}}单位数,unsigned int指定位数在CHAR_BIT

答案 2 :(得分:1)

一种可能的解决方案是使用一个union,它的所有成员都与内存中的相同偏移量对齐。

示例:

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 };

答案 3 :(得分:1)

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

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