138 lines
3.2 KiB
C++
138 lines
3.2 KiB
C++
|
|
#pragma once
|
|||
|
|
|
|||
|
|
#include <vector>
|
|||
|
|
#include <string>
|
|||
|
|
#include <cstdint>
|
|||
|
|
#include <stdexcept>
|
|||
|
|
#include <algorithm>
|
|||
|
|
|
|||
|
|
class Blob
|
|||
|
|
{
|
|||
|
|
using BYTE = unsigned char;
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
const std::vector<BYTE> &m_blob;
|
|||
|
|
size_t m_offset;
|
|||
|
|
|
|||
|
|
// 检查是否有足够的剩余字节
|
|||
|
|
void checkSize(size_t required) const
|
|||
|
|
{
|
|||
|
|
if (m_offset + required > m_blob.size())
|
|||
|
|
{
|
|||
|
|
throw std::out_of_range("Insufficient data in blob");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
// 构造函数,接受一个字节向量的引用
|
|||
|
|
Blob(const std::vector<BYTE> &blob) : m_blob(blob), m_offset(0) {}
|
|||
|
|
|
|||
|
|
// 重置解析偏移量
|
|||
|
|
void reset() { m_offset = 0; }
|
|||
|
|
|
|||
|
|
// 获取当前偏移量
|
|||
|
|
size_t getOffset() const { return m_offset; }
|
|||
|
|
|
|||
|
|
// 设置偏移量
|
|||
|
|
void setOffset(size_t offset)
|
|||
|
|
{
|
|||
|
|
if (offset > m_blob.size())
|
|||
|
|
{
|
|||
|
|
throw std::out_of_range("Offset out of range");
|
|||
|
|
}
|
|||
|
|
m_offset = offset;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 获取剩余字节数
|
|||
|
|
size_t remaining() const { return m_blob.size() - m_offset; }
|
|||
|
|
|
|||
|
|
// 读取一个T类型的数据(适用于基本类型)
|
|||
|
|
template <typename T>
|
|||
|
|
T get()
|
|||
|
|
{
|
|||
|
|
checkSize(sizeof(T));
|
|||
|
|
|
|||
|
|
T value;
|
|||
|
|
std::copy(m_blob.begin() + m_offset,
|
|||
|
|
m_blob.begin() + m_offset + sizeof(T),
|
|||
|
|
reinterpret_cast<BYTE *>(&value));
|
|||
|
|
m_offset += sizeof(T);
|
|||
|
|
|
|||
|
|
return value;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 读取int类型
|
|||
|
|
int32_t getInt() { return get<int32_t>(); }
|
|||
|
|
|
|||
|
|
// 读取无符号int类型
|
|||
|
|
uint32_t getUInt() { return get<uint32_t>(); }
|
|||
|
|
|
|||
|
|
// 读取short类型
|
|||
|
|
int16_t getShort() { return get<int16_t>(); }
|
|||
|
|
|
|||
|
|
// 读取无符号short类型
|
|||
|
|
uint16_t getUShort() { return get<uint16_t>(); }
|
|||
|
|
|
|||
|
|
// 读取float类型
|
|||
|
|
float getFloat() { return get<float>(); }
|
|||
|
|
|
|||
|
|
// 读取double类型
|
|||
|
|
double getDouble() { return get<double>(); }
|
|||
|
|
|
|||
|
|
BYTE getByte() { return get<BYTE>(); }
|
|||
|
|
|
|||
|
|
float get256()
|
|||
|
|
{
|
|||
|
|
BYTE buf = get<BYTE>();
|
|||
|
|
return static_cast<float>(buf);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 读取指定长度的字符串
|
|||
|
|
std::string getString(size_t length)
|
|||
|
|
{
|
|||
|
|
checkSize(length);
|
|||
|
|
|
|||
|
|
std::string str(reinterpret_cast<const char *>(m_blob.data() + m_offset), length);
|
|||
|
|
m_offset += length;
|
|||
|
|
|
|||
|
|
return str;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 读取以null结尾的字符串
|
|||
|
|
std::string getNullTerminatedString()
|
|||
|
|
{
|
|||
|
|
size_t length = 0;
|
|||
|
|
size_t pos = m_offset;
|
|||
|
|
|
|||
|
|
// 查找null终止符
|
|||
|
|
while (pos < m_blob.size() && m_blob[pos] != '\0')
|
|||
|
|
{
|
|||
|
|
pos++;
|
|||
|
|
length++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 确保找到了终止符
|
|||
|
|
if (pos >= m_blob.size())
|
|||
|
|
{
|
|||
|
|
throw std::runtime_error("Null-terminated string not found");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 读取字符串(不包含终止符)
|
|||
|
|
std::string str(reinterpret_cast<const char *>(m_blob.data() + m_offset), length);
|
|||
|
|
m_offset = pos + 1; // 跳过终止符
|
|||
|
|
|
|||
|
|
return str;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 读取指定数量的字节
|
|||
|
|
std::vector<BYTE> getBytes(size_t count)
|
|||
|
|
{
|
|||
|
|
checkSize(count);
|
|||
|
|
|
|||
|
|
std::vector<BYTE> bytes(m_blob.begin() + m_offset, m_blob.begin() + m_offset + count);
|
|||
|
|
m_offset += count;
|
|||
|
|
|
|||
|
|
return bytes;
|
|||
|
|
}
|
|||
|
|
};
|