便携式有符号/无符号字节转换,C++
我正在使用有符号到无符号字节(int8_t)转换来打包字节。
uint32_t(uint8_t(byte)) << n
这可以在 Intel Linux 上使用 GCC 运行。对于其他平台/编译器(例如 PowerPC)是否可移植? 有更好的方法吗?在我的情况下使用 bitset 是不可能的。 我通过 boost 使用 stdint
I am using signed to unsigned byte(int8_t) cast to pack byts.
uint32_t(uint8_t(byte)) << n
This works using GCC on Intel Linux. Is that portable for other platforms/compilers, for example PowerPC?
is there a better way to do it? using bitset is not possible in my case.
I am using stdint via boost
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
它不可移植,因为类型 uint32_t 和 uint8_t 不是 C++ 标准的一部分。所有此类操作本质上都依赖于实现。
It's not portable, as the types uint32_t and uint8_t are not part of the C++ Standard. All such maipulations are inherently implementation dependent.
如果您使用 Boost Integer 库中的
boost/cstdint.hpp
,那么是的,typedef 是可移植的(跨平台)。boost/cstdint.hpp
标头是旨在用 C++ 实现 C99 stdint.h 功能。来自 Boost 文档:
If you are using
boost/cstdint.hpp
from the Boost Integer library, then yes, the typedefs are portable (cross-platform.) Theboost/cstdint.hpp
header is meant to implement C99 stdint.h functionality in C++.From the Boost documentation:
在实践中,是的,它很可能适用于您遇到的大多数其他平台(特别是如果 Boost 移植到它)。但是,如果您将这些打包值写入文件或网络套接字,则必须处理字节顺序(您的 PowerPC 示例具有大端字节顺序,而英特尔具有小端字节顺序)。在这方面,代码在不同的硬件架构上会有不同的表现。
In practice, yes it's most likely going to work on most other platforms you encounter (especially if Boost is ported to it). However, if you are writing these packed values to files or network sockets, you'll have to deal with byte order (your example of PowerPC has big-endian byte order while Intel have little-endian). In that respect, the code will behave differently on different hardware architectures.