C++用于从流中读取二进制值的任何标准库



我的意思是说我有一个包含 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;
};

最新更新