C:将收到的Winsock数据包保存为文件为十六进制

时间:2010-07-21 18:08:23

标签: c arrays char hex

我需要做大多数数据包监控程序所做的事情(Wireshark,tcpdump等)。当通过Winsock接收数据时,我只需要将数据包转换为十六进制表示并将其保存到文件中。

数据只是一个简单的char数组。

我尝试过很多像sprintf这样的东西,但没有运气。我也不想使用itoa,因为它不是我学到的标准C.

示例:

如果数据包包含“test”,则应将其转储为“74 65 73 74”文件。

我可以完成所有文件处理工作,并且Winsock代码正常工作,我想我只需编写一个函数将char数组转换为十六进制表示,我似乎无法得到它。 / p>

4 个答案:

答案 0 :(得分:4)

也许您应该展示自printf()以来所尝试的内容,其变体是迄今为止最简单的解决方案。

int emit_hex( FILE* file, const char* data, size_t len )
{
    int length = 0 ;
    size_t i ;

    for( i = 0; i < len; i++ )
    {
        length += fprintf( file, "%2.2X", (unsigned)pkt[i] ) ;
        if( i < len - 1)
        {
            length += fprintf( " " ) ;
        }
    }

    return length ;
}

答案 1 :(得分:3)

略高级功能:


#include <stdio.h>
#include <string.h>
#include <error.h>

void dump(FILE* pFile, const char* szData, unsigned long ulSize)
{
  const char* pBuff = szData;
  unsigned long i = 0;
  unsigned long j = 0;

  for(i = 0; i < ulSize; i += 0x10)
  {
    if((i % 0x10) == 0)
      fprintf(pFile, "\n0x%8p   ", (i + szData));

    for(j = 0; ((i + j) < ulSize) && (j < 0x10); j++)
      fprintf(pFile, "%.2x ", (unsigned char)pBuff[i+j]);

    for(; j < 0x10; j++)
      fprintf(pFile, "   ");

    fprintf(pFile, "  ");

    for(j = 0; ((i + j) < ulSize) && (j < 0x10); j++)
      fprintf(pFile, "%c", (unsigned char)pBuff[i+j] > ' ' ? pBuff[i+j] : '.');
  }
  fprintf(pFile, "\n\n");
  fflush(pFile);
}


int main()
{
  FILE* pFile = fopen("dump.txt", "wt+");
  if (!pFile)
  {
    perror("error while opening file");
    return 1;
  }

  const char* szData = "1234567890qwertyuiop"; // received data
  unsigned long ulSize = (unsigned long)strlen(szData); // data length just for example

  dump(pFile, szData, ulSize);
  fclose(pFile);
}

输出格式(指针,十六进制,字符):

0x0x400a9c   31 32 33 34 35 36 37 38 39 30 71 77 65 72 74 79   1234567890qwerty
0x0x400aac   75 69 6f 70                                       uiop

答案 2 :(得分:1)

sprintf使用%x转换为十六进制,因此您通常会使用以下内容:

cvt2hex(unsigned len, char const *input, char *output) { 
    int i;
    for (i=0; i<len; i++)
        sprintf(output+i*3, "%2.2x ", input[i]);
}

当然,output需要指向足够的内存来保存转换后的数据。您通常希望在每16或32个字节后或该附近的某个位置插入换行符。

答案 3 :(得分:0)

另一种方法是对char(hh)使用长度修饰符:

printf("%hhx", c);