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

1 篇文章 0 订阅
1 篇文章 0 订阅

转化涉及到的函数说明
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/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 “iios/“过滤掉,再将非’@'的一串内容送到buf中
    sscanf(“iios/12DDWDFF@122”, “%*[/]/%[@]”, 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输入。第三个参数都是需要转化的字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值