用 sprintf 和 sscanf 函数实现数值数组和字符数组互相转换。
sprintf 把数值转成字符,sscanf 把字符转为数值。
实例:
#include <stdio.h>
#include <assert.h>
/*
*
* 名称:Binary2Token
* 描述:数值数组转字符数组
* 参数:binary - 数值数组,输入要转换的数值;
* len - binary数组里的数值个数(以字节为单位);
* token - 字符数组,输出转换后的字符;
* size - token数组的空间(以字节为单位)。
* 返回:转成的字符个数,以字节为单位。
*/
int Binary2Token(const unsigned char* binary, const int len, char* const token, const int size)
{
int i, n;
printf("--- Binary2Token ---\n");
n = len * 2;
assert(n < size);
for (i = 0; i < len; i++)
sprintf(token + i * 2, "%02X", binary[i]); // 考虑到一个字节数值的前面4个比特位非0的情况,用两个字符的宽度存放每个字节的数值,如果前面4个比特位为0就补'0'。
return n;
}
/*
*
* 名称:Token2Binary
* 描述:字符数组转数值数组
* 参数:token - 字符数组,输入要转换的字符;
* len - token数组里的字符个数(以字节为单位);
* binary - 数值数组,输出转换后的数值;
* size - binary数组的空间(以字节为单位)。
* 返回:转成的数值个数,以字节为单位。
*/
int Token2Binary(const char* token, const int len, unsigned char* const binary, const int size)
{
const char* p;
int i, n, m;
char buf[3] = {0,0,0};
printf("--- Token2Binary ---\n");
m = len % 2 ? (len - 1) / 2 : len / 2;
assert(m < size);
// 为了提高效率,先两个两个字符地转换:
for (i = 0; i < m; i++)
{
p = token + i * 2;
buf[0] = p[0];
buf[1] = p[1];
n = 0;
sscanf(buf, "%X", &n);
binary[i] = n;
}
// 再转换最后一个字符(如果有):
if(len % 2)
{
buf[0] = p[2];
buf[1] = 0;
n = 0;
sscanf(buf, "%X", &n);
binary[i] = n;
i++;
}
return i;
}
int main()
{
const unsigned char BINARY[16] = {0,1,2,3,4,5,6,7,0xFF,9,10,11,12,13,14,15};
int i, n;
char token[200];
unsigned char binary[200];
n = Binary2Token(BINARY, 16, token, sizeof(token));
printf("%s\n", token);
n = Token2Binary(token, n, binary, sizeof(binary));
for (i = 0; i < n; i++)
printf("%d ", binary[i]);
printf("\n");
n = Token2Binary("0123456789ABCDEFF", 17, binary, sizeof(binary));
for (i = 0; i < n; i++)
printf("%d ", binary[i]);
printf("\n");
return 0;
}
运行结果:
--- Binary2Token ---
0001020304050607FF090A0B0C0D0E0F
--- Token2Binary ---
0 1 2 3 4 5 6 7 255 9 10 11 12 13 14 15
--- Token2Binary ---
1 35 69 103 137 171 205 239 15