考虑一下:
#include <stdio.h>
int main()
{
char Buffer[100] = "01 05 01 4A 63 41" ;
const char* h = &Buffer[0] ;
int i ;
while( *h != 0 )
{
if( sscanf( h, "%2x", &i ) == 1 )
{
printf( "0x%02X (%d)\n", i, i ) ;
}
h += 3 ;
}
return 0;
}
其输出为:
0x01 (1)
0x05 (5)
0x01 (1)
0x4A (74)
0x63 (99)
0x41 (65)
我假设所有的值都是十六进制的,都是两位数,并且都由一个空格(或者更确切地说是一个非 hex-difgit 字符)分隔,并且数组是 nul 终止的。如果其中任何一个条件不成立,则代码将需要修改。例如,如果值可能是可变长度,则格式说明符需要更改,并且您应该递增h
直到找到空格或 nul,如果找到空格,则再次递增。
strtol()
您可以使用而不是sscanf()
for 转换编写类似的代码,但atoi()
特定于十进制字符串,因此无法使用。
如果您对指针算法感到不舒服,那么通过数组索引等效的是:
#include <stdio.h>
int main()
{
char Buffer[100] = "01 05 01 4A 63 41" ;
int c = 0 ;
int i ;
while( *h != 0 )
{
if( sscanf( &Buffer[c], "%2x", &i ) == 1 )
{
printf( "0x%02X (%d)\n", i, i ) ;
}
c += 3 ;
}
return 0;
}
以及strtol()
您喜欢的版本:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char Buffer[100] = "01 05 01 4A 63 41" ;
const char* h = &Buffer[0] ;
while( *h != 0 )
{
int i = strtol( h, 0, 16 ) ;
printf( "0x%02X (%d)\n", i, i ) ;
h += 3 ;
}
return 0;
}