0

我正在使用此代码来读取结果缓冲区。我的问题只是如何将显示十六进制字符的 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
} 
4

2 回答 2

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。

于 2012-07-20T23:09:05.573 回答
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 变量更好的函数。

于 2012-07-20T23:08:56.307 回答