:概述
我们知道一个字节占8bit; 0000000 ~ 11111111
用char的形式表示的话-128 ~ 127为什么还要稍后补充呢!
用byte表示,0 ~ 255与unsigned char相同。 因为c语言本身没有byte型
用十六进制表示时,为0x00 ~0xFF
问题:
必须提供字符串,但要在十六进制中使用,必须将两个字节放入一个字节中。 在十六进制中,一个字节由两个数字表示,字符串形式占两个字节。 在这种情况下,转换是必要的,高级语言的转换简单易用。 在此,如果以c语言形式进行变换,则通用性变高
十六进制字符串(即一系列字符串(313233435363738393a3b3c3e3f40 ) )如果是字符串格式,则占用32个字节;如果他们是十六进制表示),则占用0x 31,0x 32 .0x 40,则占用16个字节。 怎么转换成16字节大小的byte数组呢?
想法:首先,最初的组0x31,转换为十进制的话就是49。 那么,怎么变换呢,一般是先变换成二进制再变换成十进制。那个用程序怎么表示呢? 让我想想。 3用二进制表示0000 0001,1用二进制表示0000 0001。 那么,如何在内存中存储0x31呢? 因为我们知道十六进制表示一个数字的范围时0~F,所以表示一个字节需要两个十六进制。 那么,0x31的存储表示一个字节的前四位为3,后四位为1,即00110001 (十进制49 )。 那么,如何将文字3转换成数字3,再存储到前4位,用代码表示的话
//字符串' 31 '; 分解成文字如下
//这里以数字为例,如果有ABCDEF,就需要另外考虑。
char m='3';
char n='1';
unsigned char byte=0; //1字节存储并使用0x31。 C语言中没有字节类型,但在此用unsigned char代替。 同样的效果
//首先将字符'3'转换为数字3; 将字符'1'转换为数字1
//最简单的是'3' - '0'即m=m - '0';
//更好的方法是位运算(没有经验就不习惯,大神飘),如下
m=m ~0x30; //或m=m ~'0'; m=m ~48;
//与字符'1'相同,此时m=3,n=1; 接下来是如何存储在一个字节中
//3向左偏移4位,则00000011为00110000
加上//1(0000001 )就可以了,代码显示是
m=m 4;
byte=m | n;
看结果是:
结果. png
那么,你怎么封装函数来做这件事? 直接附加代码
#包含
#包含
#包含
inthexstringtobyte(char*in,unsigned char *out );
inthexstringtobyte(char*in,unsigned char *out ) )
intlen=(int ) strlen ) in;
char*str=(char* ) malloc ) Len;
memset(str,0,len );
memcpy(str,in,len );
for(intI=0; i len; I=2({
//将小写字母改为大写
if(str[I]='a'str[I]='f ' ) str [ I ]=str [ I ]至0x 20;
if(str[I1]='a'str[I]='f ' ) str [ i1 ]=str [ i1 ]至0x 20;
//处理前四位
if(str[I]='a'str[I]='f ' )
out[I/2]=(str[I]-'a'10 ) 4;
else
out[I/2]=(str[I]~0x30 ) 4;
//处理并组合后4位
if(str[I1]='a'str[I1]='f ' )
out[I/2]|=(str[I1]-'a'10 );
else
out[i/2] |=(str[i 1] ~0x30;
}
free(str );
返回0;
}
intbytetohexstring (unsigned char * in,int len,char *out );
intbytetohexstring (unsigned char * in,int len,char *out ) )
for(intI=0; i len; I ) {
if(in[I]4)=10 ) in[I]4)=15 ) ) ) ) ) ) ) ) ) ) )。
out[2*I]=(in[I]4) ' A' - 10;
else
out[2*I]=(in[I]4)|0x30;
if(in[I]0x0f )=10 ) in[I]0x0f )=15 ) ) ) ) ) ) )。
out[2*I1]=(in[I]0x0f ) ' A' - 10;
else
out[2*I1]=(in[I]0x0f )|0x30;
}
返回0;
}
使用以下:
intmain(intargc,const char * argv[] ) () ) )
char * str=' fa 32333435363738393 a3b 3c 3d 3e 3f 40 ';
unsigned char temp[16]={0};
hexstringtobyte(str,temp );
for(intI=0; i 16; I ) {
printf('%d ',temp[i] );
}
打印((n );
char out[33]={0};//多留了一个保管“ ”
bytetohexstring(temp,16,out );
打印(% s (n ),out );
返回0;
}