#ifndef INCLUDED_C_HEX_H #define INCLUDED_C_HEX_H #ifndef INCLUDED_C_TYPES_H #include #endif /*INCLUDED_C_TYPES_H*/ /* -------------------------------------------------------------------------------------------------------------- */ /* */ void c_Hex_DumpBin(const void* data, c_size_t size, int line_size); void c_Hex_Dump(const void *data, c_size_t size); void c_Hex_DumpTo(const void *data, c_size_t size, void (*dump)(const char*, ...)); c_err_t c_Hex_HexToBin(const char* hex_str, void* out_bin, c_size_t bin_max_cap, c_size_t* out_size); /** * @brief 工业级二进制安全:二进制字节流正向解析还原为标准十六进制文本字符串 * * @param in_bin 待转化的二进制字节流物理缓冲区首地址(二进制安全,支持 \0 内置流) * @param bin_size 二进制字节流的绝对有效物理字节总大小 (N) * @param uppercase 控制开关:true 导出为大写十六进制字符串(如 "4A00FE");false 导出为小写(如 "4a00fe") * @param out_hex_str 由外部声明传入、用于承接导出的十六进制可写文本缓冲区起始地址 * @param hex_max_cap 外部文本缓冲区的最大物理插槽配额上限限制(防缓冲区溢出踩踏) */ c_err_t c_Hex_BinToHex(const void* in_bin, c_size_t bin_size, bool uppercase, char* out_hex_str, c_size_t hex_max_cap); /* ================================================================================ */ #define C_HEX_SET_UINT8(array, idx, u8v) ((array)[(idx)]=(u8v)&0xFF) #define C_HEX_SET_UINT16_BE(array, idx, u16v) \ do{ \ (array)[(idx)] = ((u16v) >> 8) & 0xFF; \ (array)[(idx)+1] = ((u16v)) & 0xFF; \ }while(0) #define C_HEX_SET_UINT16_LE(array, idx, u16v) \ do{ \ (array)[(idx)] = ((u16v)) & 0xFF; \ (array)[(idx)+1] = ((u16v) >> 8) & 0xFF; \ }while(0) #define C_HEX_SET_UINT24_BE(array, idx, u24v) \ do{ \ (array)[(idx)] = ((u24v) >> 16) & 0xFF; \ (array)[(idx)+1] = ((u24v) >> 8) & 0xFF; \ (array)[(idx)+2] = ((u24v)) & 0xFF; \ }while(0) #define C_HEX_SET_UINT24_LE(array, idx, u24v) \ do{ \ (array)[(idx)] = ((u24v)) & 0xFF; \ (array)[(idx)+1] = ((u24v) >> 8) & 0xFF; \ (array)[(idx)+2] = ((u24v) >> 16) & 0xFF; \ }while(0) #define C_HEX_SET_UINT32_BE(array, idx, u32v) \ do{ \ (array)[(idx)] = ((u32v) >> 24) & 0xFF; \ (array)[(idx)+1] = ((u32v) >> 16) & 0xFF; \ (array)[(idx)+2] = ((u32v) >> 8) & 0xFF; \ (array)[(idx)+3] = ((u32v)) & 0xFF; \ }while(0) #define C_HEX_SET_UINT32_LE(array, idx, u32v) \ do{ \ (array)[(idx)] = ((u32v)) & 0xFF; \ (array)[(idx)+1] = ((u32v) >> 8) & 0xFF; \ (array)[(idx)+2] = ((u32v) >> 16) & 0xFF; \ (array)[(idx)+3] = ((u32v) >> 24) & 0xFF; \ }while(0) #define C_HEX_SET_UINT64_BE(array, idx, u64v) \ do{ \ (array)[(idx)] = ((u64v) >> 56) & 0xFF; \ (array)[(idx)+1] = ((u64v) >> 48) & 0xFF; \ (array)[(idx)+2] = ((u64v) >> 40) & 0xFF; \ (array)[(idx)+3] = ((u64v) >> 32) & 0xFF; \ (array)[(idx)+4] = ((u64v) >> 24) & 0xFF; \ (array)[(idx)+5] = ((u64v) >> 16) & 0xFF; \ (array)[(idx)+6] = ((u64v) >> 8) & 0xFF; \ (array)[(idx)+7] = ((u64v)) & 0xFF; \ }while(0) #define C_HEX_SET_UINT64_LE(array, idx, u64v) \ do{ \ (array)[(idx)] = ((u64v)) & 0xFF; \ (array)[(idx)+1] = ((u64v) >> 8) & 0xFF; \ (array)[(idx)+2] = ((u64v) >> 16) & 0xFF; \ (array)[(idx)+3] = ((u64v) >> 24) & 0xFF; \ (array)[(idx)+4] = ((u64v) >> 32) & 0xFF; \ (array)[(idx)+5] = ((u64v) >> 40) & 0xFF; \ (array)[(idx)+6] = ((u64v) >> 48) & 0xFF; \ (array)[(idx)+7] = ((u64v) >> 56) & 0xFF; \ }while(0) #define C_HEX_GET_UINT8(array, idx) (((array)[(idx)])&0xFF) #define C_HEX_GET_UINT16_BE(array, idx) ((((array)[(idx)]&0xFF)<<8) | ((array)[(idx)+1] & 0xFF)) #define C_HEX_GET_UINT16_LE(array, idx) (((array)[(idx)]&0xFF) | (((array)[(idx)+1] & 0xFF)<<8) ) #define C_HEX_GET_UINT24_BE(array, idx) ( (((array)[(idx)]&0xFF)<<16) | (((array)[(idx)+1]&0xFF)<<8) | ((array)[(idx)+2] & 0xFF) ) #define C_HEX_GET_UINT24_LE(array, idx) ( ((array)[(idx)]&0xFF) | (((array)[(idx)+1]&0xFF)<<8) | (((array)[(idx)+2]&0xFF)<<16) ) #define C_HEX_GET_UINT32_BE(array, idx) ( \ (((array)[(idx)]&0xFF)<<24) \ | (((array)[(idx)+1]&0xFF)<<16) \ | (((array)[(idx)+2]&0xFF)<<8) \ | ((array)[(idx)+3] & 0xFF) ) #define C_HEX_GET_UINT32_LE(array, idx) ( \ ((array)[(idx)]&0xFF) \ | (((array)[(idx)+1]&0xFF)<<8) \ | (((array)[(idx)+2]&0xFF)<<16) \ | (((array)[(idx)+3]&0xFF)<<24) ) #define C_HEX_GET_UINT64_BE(array, idx) ( \ ((uint64_t)((array)[(idx)]&0xFF)<<56) \ | ((uint64_t)((array)[(idx)+1]&0xFF)<<48) \ | ((uint64_t)((array)[(idx)+2]&0xFF)<<40) \ | ((uint64_t)((array)[(idx)+3]&0xFF)<<32) \ | ((uint64_t)((array)[(idx)+4]&0xFF)<<24) \ | ((uint64_t)((array)[(idx)+5]&0xFF)<<16) \ | ((uint64_t)((array)[(idx)+6]&0xFF)<<8) \ | ((uint64_t)(array)[(idx)+7] & 0xFF) ) #define C_HEX_GET_UINT64_LE(array, idx) ( \ ((uint64_t)(array)[(idx)]&0xFF) \ | ((uint64_t)((array)[(idx)+1]&0xFF)<<8) \ | ((uint64_t)((array)[(idx)+2]&0xFF)<<16) \ | ((uint64_t)((array)[(idx)+3]&0xFF)<<24) ) \ | ((uint64_t)((array)[(idx)+4]&0xFF)<<32) ) \ | ((uint64_t)((array)[(idx)+5]&0xFF)<<40) ) \ | ((uint64_t)((array)[(idx)+6]&0xFF)<<48) ) \ | ((uint64_t)((array)[(idx)+7]&0xFF)<<56) ) #endif /*INCLUDED_C_HEX_H*/