#pragma once #include #include #include #include #include using namespace std; // 定义宏用于注册获取不同类型值的函数 #define REGISTER_GET_FUNCTION(Type, FunctionName) \ Type Get##FunctionName() { \ char buffer[sizeof(Type)]; \ read(buffer, sizeof(Type)); \ Type result; \ std::memcpy(&result, buffer, sizeof(Type)); \ return result; \ } class IO_Ex { public: //原始数据 char* _Data; //最大长度 int _MaxLen = 0; //当前位置 int _CurPos = 0; //上一次读取的实际大小 int _LastReadSize = 0; public: IO_Ex(char* data,int len) { _Data = data; _MaxLen = len; } ~IO_Ex(); public: int tellg() { return _CurPos; } void read(char* ptr, int size) { if ((size + _CurPos) > _MaxLen) { size = _MaxLen - _CurPos; } memcpy(ptr, _Data + _CurPos, size); _CurPos += size; _LastReadSize = size; } int gcount() { return _LastReadSize; } void seek(int _jidx) { _CurPos = _jidx; } public: unsigned int charPtrToInt(const char* bytes) { unsigned int result; std::memcpy(&result, bytes, sizeof(int)); return result; } void CrcDecode(const int Length, const int crc32) { int num = 0x81A79011; for (int i = 0; i < Length; i += 4) { int Pos = tellg(); char buffer[4]; read(buffer, 4); unsigned int anInt = charPtrToInt(buffer); unsigned int val = (anInt ^ num ^ crc32); unsigned int jiemi = (val >> 6) | ((val << (32 - 6)) & 0xFFFFFFFF); _Data[Pos] = ((jiemi >> 0) & 0xFF);; _Data[Pos + 1] = ((jiemi >> 8) & 0xFF); _Data[Pos + 2] = ((jiemi >> 16) & 0xFF); _Data[Pos + 3] = ((jiemi >> 24) & 0xFF); } } std::string tolower(std::string str) { for (size_t i = 0; i < str.length(); ++i) { str[i] = std::tolower(str[i]); } return str; } std::vector split(const std::string& str, const std::string& delimiter) { std::vector tokens; size_t pos = 0; size_t found; while ((found = str.find(delimiter, pos)) != std::string::npos) { tokens.push_back(str.substr(pos, found - pos)); pos = found + delimiter.length(); } tokens.push_back(str.substr(pos)); return tokens; } public: REGISTER_GET_FUNCTION(int, Int); REGISTER_GET_FUNCTION(short, Short); REGISTER_GET_FUNCTION(unsigned short, UShort); std::string GetString(const int size) { char* buffer = new char[size]; read(buffer, size); if (gcount() != size) { std::cerr << "未能成功读取指定字节数的数据!" << std::endl; delete[] buffer; return ""; } std::string result(buffer, size); delete[] buffer; return result; } private: }; IO_Ex::~IO_Ex() { }