我需要做大多数数据包监控程序所做的事情(Wireshark,tcpdump等)。当通过Winsock接收数据时,我只需要将数据包转换为十六进制表示并将其保存到文件中。
数据只是一个简单的char数组。
我尝试过很多像sprintf这样的东西,但没有运气。我也不想使用itoa,因为它不是我学到的标准C.
示例:
如果数据包包含“test”,则应将其转储为“74 65 73 74”文件。
我可以完成所有文件处理工作,并且Winsock代码正常工作,我想我只需编写一个函数将char数组转换为十六进制表示,我似乎无法得到它。 / p>
答案 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);