我正在使用此代码来读取结果缓冲区。我的问题是如何将显示十六进制字符的C值复制到一个新字符串中,我可以在for循环结束时打印出来。
for (long i=1; i<sizeof(buffer); i++) //for all chars in string
{
unsigned char c = buffer[i];
switch (Format)
{
case 2: //hex
printf("%02x",c);
break;
case 1: //asc
printf("%c",c); // want to copy c to a varriable byte by byte
break;
} //end of switch format
}
答案 0 :(得分:1)
如果我理解正确,这就是你需要的:
#include <stdio.h>
#include <string.h>
int main() {
long i;
int Format = 2;
char buffer[20] = "Test string";
char result[60] = "";
for (i=0; i<sizeof(buffer); i++) //for all chars in string
{
unsigned char c = buffer[i];
char* printf_format;
switch (Format) {
case 2: //hex
printf_format = "%02x";
break;
case 1: //asc
printf_format = "%c";
break;
} //end of switch format
sprintf(result + strlen(result), printf_format, c);
}
printf("result: %s\n", result);
}
这里result + strlen(result)
是指向字符串结尾的指针。所以sprintf
将写到最后。请注意,您必须确定输出字符串的长度,并分配足够的内存来保存它。另请注意,循环中i
的第一个值应为0而不是1。
答案 1 :(得分:0)
char *printit(char *buffer, long buflen)
{
char out[512];
int offset=0;
for (long i=1; i<buflen; i++)
{
int l = snprintf(out+offset, sizeof(out)-offset, Format==1?"%c":"%02x", buffer[i]);
if (l > sizeof(out)-offset)
{
fprintf(stderr, "Output buffer insufficiently large\n");
return(NULL);
}
offset += l-1;
}
return(strdup(out));
}
请注意,在您的问题代码中,您正在跳过缓冲区的第一个字符。 isprint()可能是一个比神秘的Format变量更好的函数。