C++用于从流中读取二进制值的任何标准库
C++ any standard library for reading binary values from a stream
我的意思是说我有一个包含 4 个字节的文件0x2a x00 0x00 0x00
我想去(假设 f 是一个开放的 ifstream(
uint32_t x;
f >> x;
并且 x 包含 42
我知道这行不通,但似乎这样做是一件显而易见的事情,令人惊讶的是它不在标准中。例如,一个打开的标志,上面写着ios::binaryio。
建议的事情通常是
f.read(reinterpret_cast<char*>(&x), sizeof(x));
这是丑陋和不安全
的仍然没有从流中读取二进制值的库标准
有两个:C API 和C++ API。
这简直丑陋
始终可以将这些调用包装到根据您的需求量身定制的更优雅的界面中。
和不安全
包装器也可以处理这个问题。
我想还不标准... 但是你可以很容易地找到一个或自己写。 这是在 GitHub 上找到的示例
这是另一个:
class StreamUtility
{
public:
StreamUtility();
StreamUtility(const StreamUtility&) = delete;
StreamUtility& operator=(const StreamUtility&) = delete;
~StreamUtility() = default;
enum endianness{ eBigEndian=0, eLittleEndian };
static endianness getLocalMachineByteOrder();
endianness getStreamFormat() const {return mStreamFormat;}
bool readBytes(std::istream& iStream, size_t iNumberOfBytesToRead, char *oV);
bool readBytes(std::istream& iStream, size_t iNumberOfBytesToRead, std::string *oV);
bool readChar(std::istream& iStream, size_t iNumberOfCharToRead, std::string *oV);
bool readDouble(std::istream& iStream, double *oV);
bool readFloat32(std::istream& iStream, float *oV);
bool readInt8(std::istream& iStream, int8_t *oV);
bool readInt16(std::istream& iStream, int16_t *oV);
bool readInt32(std::istream& iStream, int32_t *oV);
bool readInt64(std::istream& iStream, int64_t *oV);
bool readUint8(std::istream& iStream, uint8_t *oV);
bool readUint16(std::istream& iStream, uint16_t *oV);
bool readUint32(std::istream& iStream, uint32_t *oV);
bool readUint64(std::istream& iStream, uint64_t *oV);
void setStreamFormat(endianness);
void write(std::ostream& iStream, ByteArray);
void write(std::ostream& iStream, int8_t);
void write(std::ostream& iStream, int16_t);
void write(std::ostream& iStream, int32_t);
void write(std::ostream& iStream, int64_t);
void write(std::ostream& iStream, uint8_t);
void write(std::ostream& iStream, uint16_t);
void write(std::ostream& iStream, uint32_t);
void write(std::ostream& iStream, uint64_t);
void write(std::ostream& iStream, float);
void write(std::ostream& iStream, double);
void write(std::ostream& iStream, size_t iNumberOfBytesToWrite, const char *ipData);
void writeBytes(std::ostream& iStream, const std::string& iData);
void writeChar(std::ostream& iStream, const std::string& iData);
protected:
bool needsSwapping() const;
void swapBytes2(void* iV);
void swapBytes4(void* iV);
void swapBytes8(void* iV);
endianness mStreamFormat;
};
相关文章:
- C++用于从流中读取二进制值的任何标准库
- 任何用于 boost::p roperty 树的标准库实现
- 是否有任何 C 标准函数将值"1"传递给所有 (%s)
- 标准库中的任何正则表达式语法是否支持 (?(定义)用于子模式参考?
- 是否有任何版本的C++(甚至是试行标准)是"throw()"并不意味着"cannot throw, ever"?
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 是否可以将引用存储在标准::任何中
- 无法移动标准::任何
- 非复制标准::shared_ptr<提升::任何>?
- SSO在STD :: String以外的任何其他标准库容器中使用
- 确定C++中用户输入的类型,而无需任何标准库函数
- 是否有任何标准的 Linux C++输入库输出和使用
- 是否有任何标准的Visual Studio 2008插件可用于跟踪/记录C++项目的构造函数和析构函数调用
- 如何在不使用任何标准运算符(如 *,-,/,% 等)的情况下将数字与 3.5 相乘
- 有没有任何标准的算法来进行向量元素的成对比较
- 指定移动后任何标准类的状态
- 对于stl容器是否有任何标准布局保证?
- c 预处理器 - C++ #include查找是否有任何标准要求
- 是否有任何标准的包含顺序来避免隐藏的依赖关系
- 接收任何标准映射的函数模板