介绍
&emps; Hex(十六进制)编码是一种将数据转换为十六进制表示的方法。Hex编码使用16个字符来表示数据。
&emps; 1 2 3 4 5 6 7 8 9 a b c d e f
编码方式
每个字节(8位)转换为两个十六进制字符来表示,第一个字符代表高4位,第二个字符代表低四位。
C语言实现
利用sprintf
void toHex(const unsigned char *input, char *output, size_t len) {for (size_t i = 0; i < len; i++) {// 将每个字节转换为两位十六进制数sprintf(output + (i * 2), "%02x", input[i]);}output[len * 2] = '\0'; // 确保输出字符串以空字符结尾
}int main(){const char* str = "Bileton";char* ret =(char*) malloc(sizeof(str));toHex(str, ret, strlen(str));printf("%s", ret);
}
自写实现
void to_Hex(const unsigned char *str,char *ret,int len){char index_table[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};for (int i = 0; i < len; ++i) {ret[i*2] = index_table[str[i] >> 4];ret[i*2+1] = index_table[str[i] & 0xF];}ret[len*2]='\0';
}
void to_Hex(const unsigned char *str,char *ret,int len){for (int i = 0; i < len; ++i) {ret[i*2] = ((str[i] >> 4) >= 0xa) ? ( (str[i] >> 4) + 65) : ((str[i] >> 4) + 48);ret[i*2+1] = ((str[i] & 0xF) >= 0xa) ? ((str[i] & 0xF) + 65) : ((str[i] & 0xF) + 48);}ret[len*2]='\0';
}
Java调用和实现
调用
public static void main(String[] args) {String data = "Bielton";String result = bytetoHex(data.getBytes());System.out.println(result);}public static String bytetoHex(byte[] data){return HexFormat.of().formatHex(data);}
自实现
public String bytesToHex(byte[] data){final char[] HEX_DIGITS = "0123456789abcdef".toCharArray();char[] result = new char[data.length*2];int c = 0;for(byte b:data){result[c++] = HEX_DIGITS[ (b>>4) & 0xf]; //保留高位result[c++] = HEX_DIGITS[b & 0xf]; //保留低位}return new String(result);}
Python调用
import binascii# 字符串
data = "Bileton"
# 将字符串以UTF-8编码转换为字节类型,然后将字节序列转换为十六进制表示
hex_encode = binascii.hexlify(data.encode('utf-8'))
print(hex_encode) # b'42696c65746f6e'# 将字节序列解码为UTF-8编码的字符串
print(hex_encode.decode('utf-8'))