Files
2026-08-31 22:49:42 +08:00

149 lines
6.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef INCLUDED_C_HEX_H
#define INCLUDED_C_HEX_H
#ifndef INCLUDED_C_TYPES_H
#include <c_Types.h>
#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*/