我正在使用C ++中的副本GM缓冲系统来熟悉位等等,这也不错,但我遇到了一个问题。如何将4个不同的字符推入int?我不是最好的按位,我从来没用过它。我不知道怎么做。
在这件事中,我有一系列的字符;大小byteArraySize
,当我调用grab int函数时,它将从bufferPointer + 4
到bufferPointer
的字节数;向后以正确地抓住int。
我在bitshifting(lol)上读了位,我想我可以将每个char的位i
向右移位。我不知道从哪里开始。
非常感谢任何帮助。
答案 0 :(得分:2)
讽刺的是,在纯标准C ++ 14或C ++ 11中,你可能不会。
AFAIK,没有任何内容禁止假设的C ++ 14实现拥有... new ParseFile("nameofvideo.mp4", videoBytes);
,char
,short
,unsigned short
,int
,{{ 1}},unsigned int
,long
,unsigned 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而其他实现已签名。
答案 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的大小(或更大)相同,但你永远不会知道,除非你发现它。