欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

十六进制、十进制、字符串之间的转化

程序员文章站 2024-03-17 12:13:04
...

转化涉及到的函数说明
1.函数原型:int sprintf(char *string, char *format [,argument,…]);
函数功能:把格式化的数据写入某个字符串缓冲区。将argument数据按照format的格式,写入string中
返回值:如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
sprintf 返回以format为格式argument为内容组成的结果被写入string的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的string后,函数sprintf 返回5
参数说明:第2个参数说明
sprintf格式的规格如下所示。[]中的部分是可选的。
%[指定参数][标识符][宽度][.精度]指示符

  1. [指定参数] 处理字符方向。负号时表示从后向前处理。
  2. [标识符] 填空字元。 0 的话表示空格填 0;空格是内定值,表示空格就放着。
  3. [宽度]字符总宽度。为最小宽度。
  4. [精度] 精确度。指在小数点后的浮点数位数。
  5. 转换字符
    %% 印出百分比符号,不转换。
    %c 字符输出到缓冲区,不转换。
    %d 整数转成十进位。
    %f 倍精确度数字转成浮点数。
    %o 整数转成八进位。
    %s 字符串输出到缓冲区,不转换。
    %x 整数转成小写十六进位。
    %X 整数转成大写十六进位。

使用”%d”或者”%x”打印一个字符,便能得出它的10 进制或16 进制的ASCII 码;反过来,使用”%c”打印一个整数,便可以看到它所对应的ASCII字符
sprintf(s, “%8x”, 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, “%-8X”, 4568); //大写16 进制,宽度占8 个位置,左对齐
sprintf(s, “%08X”, 4567); //产生:“000011D7”

2.函数原型:int sscanf( const char *buffer, const char format, [ argument ] … );
函数功能:sscanf 读取格式化的字符串中的数据。(按format的格式,将buffer中的数据,读取到argument中存放)
返回值:函数将返回成功赋值的字段个数;返回值不包括已读取但未赋值的字段个数。 返回值为 0 表示没有将任何字段赋值。 如果在第一次读取之前到达字符串结尾,则返回EOF。
参数说明:
第二个参数可以是一个或多个 {%[
] [width] [{h | I | I64 | L}]type | ’ ’ | ‘\t’ | ‘\n’ | 非%符号}
注:
1、 * 亦可用于格式中, (即 %d 和 %s) 加了星号 () 表示跳过此数据不读入. (也就是不把此数据读入参数中)
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%
[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值
失败返回0 ,否则返回格式化的参数个数
7、如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。

示例:

  1. 一般用法
    char buf[512] ={0} ;
    sscanf(“123456 “, “%s”, buf);
    printf(”%s\n”, buf);
    结果为:123456
  2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
    sscanf(“123456 “, “%4s”, buf);
    printf(”%s\n”, buf);
    结果为:1234
  3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
    sscanf(“123456 abcdedf”, “%[^ ]”, buf);
    printf("%s\n", buf);
    结果为:123456
  4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
    sscanf(“123456abcdedfBCDEF”, “%[1-9a-z]”, buf);
    printf("%s\n", buf);
    结果为:123456abcdedf
  5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
    sscanf(“123456abcdedfBCDEF”, “%[^A-Z]”, buf);
    printf("%s\n", buf);
    结果为:123456abcdedf
    6、给定一个字符串iios/[email protected],获取 / 和 @ 之间的字符串,先将 “iios/“过滤掉,再将非’@'的一串内容送到buf中
    sscanf(“iios/[email protected]”, “%*[/]/%[@]”, buf);
    printf(”%s\n”, buf);
    结果为:12DDWDFF
  6. 给定一个字符串"hello, world",仅保留"world"。(注意:“,”之后有一空格)
    sscanf(“hello, world”, “%*s%s”, buf);
    printf("%s\n", buf);
    结果为:world
    P.S. %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了,
    如果没有空格则结果为NULL。

十进制 <=> 十六进制

int a = 0;
char sHex[10];
memset( sHex, 0x00, sizeof(sHex));
/*十进制转十六进制*/
a = 29;
sprintf( sHex, "%02X", a );  /*sHex的值为:"1D" */

/*十六进制转十进制*/
memset( sHex, 0x00, sizeof( sHex ) );
strcpy( sHex, "2f" );
/*此处注意:第二个参数为%x,不是%d,第三个参数为整形的地址*/
/*按%x十六进制格式,将sHex中的数据,读取到整形变量中*/
sscanf( sHex, "%x", &a ); /*a的值为:47*/

字符串<=> 十六进制

思路:先获取字符串得到每个的字符,根据sprintf( “%2x” )将每个字符转化为十六进制值

char sHex[20+1];
char sStr[10+1];
char sTmp[100];
int i = 0;

memset( sHex, 0x00, sizeof(sHex));
memset( sStr, 0x00, sizeof( sStr ) );
memset( sTmp, 0x00, sizeof(sTmp));

strcpy( sStr, "ab" );  /*字符串按数组形式取对应字符*/
/*一个字符得到对应的2位的十六进制,所以sHex的大小应该是sStr的大小的2倍*/
sprintf( sHex, "%2x", sStr[0] );
for( i = 0; i < strlen(sStr); i++ ){
	/*'a'对应的十进制是97,十六进制是61;
	‘b’对应的十进制是98,十六进制是62*/
	/*%x字符是小写a-f,%X得到的字符为大写A-F*/
	sprintf( sTmp, "%02x", sStr[i] );  /*字符转十六进制*/
	strcat( sHex, sTmp );
}
printf( "%s", sHex );  /*sHex的值为"6162"字符串*/

字符串<=> 十进制

思路:先获取字符串的每个字符,然后将每个字符通过sprintf( “%d” )获取对应的十进制值

char sHex[20+1];
char sStr[10+1];
char sTmp[100];
int i = 0;

memset( sHex, 0x00, sizeof(sHex));
memset( sStr, 0x00, sizeof( sStr ) );
memset( sTmp, 0x00, sizeof(sTmp));

strcpy( sStr, "ab" );  /*字符串按数组形式取对应字符*/
sprintf( sHex, "%2x", sStr[0] );
for( i = 0; i < strlen(sStr); i++ ){
	/*'a'对应的十进制是97,十六进制是61;
	‘b’对应的十进制是98,十六进制是62*/
	sprintf( sTmp, "%d", sStr[i] );  /*字符转十进制*/
	strcat( sHex, " ");
	strcat( sHex, sTmp );
}
printf( "%s", sHex );  /*sHex的值为"97 98"字符串*/

字符转十六进制,转十进制,都使用sprintf()函数,只是第二个参数格式变化:十六进制是按%x输入,十进制是按%d输入。第三个参数都是需要转化的字符。