我怎么把4个字符放进一个int
How would I put 4 chars into a single int?
我正在用c++编写一个复制GM缓冲系统,以熟悉比特等,它还不错,但我遇到了一个问题。如何将4个不同的字符压入整型?我不是比特方面的高手,我从来没用过。我不知道该怎么做。
在这个东西中,我有一个字符数组;大小为byteArraySize
,当我调用抓取int函数时,它会从bufferPointer + 4
到bufferPointer
取字节;向后正确地获取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位字节(可能是signed
或unsigned
), 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 int
的char
单元的数量,而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 };
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 包装一个对象并假装它是一个 int
- cin >> int 给定一个字符串将 int 赋值为 0
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- 我从int x[3]得到的一个非常奇怪的输出;
- 在 C++11 中利用 int*_t、int_fast*_t 和 int_least*_t 之间的差异的一个很好的例子是
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- c++:如何打印出一个强制转换的 int 值?
- 通过将其中一个模板更改为 muliset 后,我可以在 PBDS 排序集上使用计数功能<int>less_equal<int>
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 超过CPU时间限制:当MPI_Sent一个非常大的int*时
- 使用无符号int作为二进制来在c++中实现一个集
- 如何声明一个必须在C++中同时存储int和char值的2D数组
- 在int main()[c++]中实现一个递归函数
- 错误:"int pow(double,int)"与上一个声明int pov(double a,int
- CStringArray::GetAt(int index) 返回一个 const. 为什么?
- 打印一个带有静态 int 的函数,有一个 std::cout 和多个 std::cout 有什么区别?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*