我希望了解有关uint8_t vs char,可移植性,位操作,最佳实践,状态等的情况.您是否对该主题有一个很好的阅读?
我希望做byte-IO.但是当然char比uint8_t有更复杂和微妙的定义;我假设是引入stdint标头的原因之一.
但是,我在多次使用uint8_t时遇到了问题.几个月前,曾经,因为没有为uint8_t定义iostream.是不是有一个C库做了很好定义的字节IO,即读写uint8_t?如果没有,我认为没有需求.为什么?
我最近的头痛源于此代码编译失败:
uint8_t read(decltype(cin) & s)
{
char c;
s.get(c);
return reinterpret_cast<uint8_t>(c);
}
error: invalid cast from type 'char' to type 'uint8_t {aka unsigned char}'
为什么错误?如何使这项工作?
最佳答案 通用,便携,往返正确的方式是:
>在API中要求所有字节值最多可以用8位表示,
>对I / O使用char,signed char和unsigned char的布局兼容性,以及
>根据需要将unsigned char转换为uint8_t.
例如:
bool read_one_byte(std::istream & is, uint8_t * out)
{
unsigned char x; // a "byte" on your system
if (is.get(reinterpret_cast<char *>(&x)))
{
*out = x;
return true;
}
return false;
}
bool write_one_byte(std::ostream & os, uint8_t val)
{
unsigned char x = val;
return os.write(reinterpret_cast<char const *>(&x), 1);
}
一些解释:规则1保证值可以在uint8_t和unsigned char之间进行往返转换,而不会丢失信息.规则2意味着我们可以对unsigned char变量使用iostream I / O操作,即使它们是以chars表示的.
我们也可以使用is.read(reinterpret_cast< char *>(& x),1)而不是is.get()来进行对称. (通常使用read,对于大于1的流计数,也需要在出错时使用gcount(),但这不适用于此.)
与往常一样,您绝不能忽略I / O操作的返回值.这样做总是程序中的错误.