在密码程序中经常需要二进制大整数装换为十六进制,如内存中8位二进制整数 00111111 (63)转化为十六进制的字符串形式“3F”.
这个转换与char a = 63; printf("%02X", a)不同, 其结果为ASCII 值为63的“?”,而不是想要的“3F ”。
#include<stdlib.h>
#include<string.h>
char byte2hex_table[256] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/**************************************************************************************************
* 1. FILENAME:Byte2Hex.c
*
* 2. int byte2hex(unsigned char * hex_string,unsigned char *byte_list,unsigned int byte_list_length)
* ---hex_string :获取转换后的十六进制字符串。
* ---byte_list :需要转换的二进制窜。
* ---byte_list_length :byte_list的长度,且要求strlen(hex_string)=(byte_list_length*2)+1
*
* 3. RETURN:成功返回1。失败为1。
*
* 4. 描述:把二进制数转化成ASCII的十六进制字符串。
* 如char * byte_list[2]={00011010,11111111}--->char *hex_string[5]="1aff"
* 可以看出转换后的十六进制字符个数是二进制数所占byte的2倍。(不包括结尾符号)
*
* 5. DATA : 2017/08/23
* AUTHOR : KeYu
*
***************************************************************************************************/
int byte2hex(unsigned char * hex_string,unsigned char *byte_list,unsigned int byte_list_length)
{
unsigned char temp_l,temp_h;
unsigned int i;
for( i = 0; i < byte_list_length; i++)
{
temp_l = (byte_list[i] & 0x0F);
hex_string[2*i+1] = byte2hex_table[temp_l];
temp_h = ((byte_list[i] >> 4) & 0x0F);
hex_string[2*i] = byte2hex_table[temp_h];
}
hex_string[2*i] = '\0';
return 1;
}
int main()
{
unsigned int byte_list_length = 4;
unsigned char byte_list[4]={0xaf,0x23,0xee,0xde};
unsigned char *hex_string = (unsigned char *)(malloc(1+2*byte_list_length));
byte2hex( hex_string,byte_list, byte_list_length);
printf("%s\n",hex_string);
}
结果:
keyu0915@keyu0915:~/CAR/STRING$ ./Byte2Hex
AF23EEDE