C++ C++;WSAsend数据包的奇怪十六进制转储

C++ C++;WSAsend数据包的奇怪十六进制转储,c++,hex,dump,packets,C++,Hex,Dump,Packets,我正在挂接WSAsend函数并转储数据包。ASCII转储可以工作,但十六进制转储有时会显示屏幕上可以看到的东西(FFFFFF DD),知道为什么吗 代码: int WINAPI myWSASend(套接字s、LPWSABUF lpBuffers、DWORD dwBufferCount、LPDWORD lpNumberOfBytesSent、DWORD dwFlags、LPWSAOOVERLAPPED lpOverlapped、LPWSAOOVERLAPPED_COMPLETION_例程LPCOM

我正在挂接WSAsend函数并转储数据包。ASCII转储可以工作,但十六进制转储有时会显示屏幕上可以看到的东西(FFFFFF DD),知道为什么吗

代码:

int WINAPI myWSASend(套接字s、LPWSABUF lpBuffers、DWORD dwBufferCount、LPDWORD lpNumberOfBytesSent、DWORD dwFlags、LPWSAOOVERLAPPED lpOverlapped、LPWSAOOVERLAPPED_COMPLETION_例程LPCOMPLETION例程)
{   
//数据包日志
如果(bLogPacketS==TRUE)
{
对于(无符号整数i=0;ilen;i=i+8)
{
printf(“%02X%02X%02X%02X%02X%02X%02X%02X\t\t%c%c%c%c%c\n”,
(无符号整数)lpBuffers->buf[i],(无符号整数)lpBuffers->buf[i+1],(无符号整数)lpBuffers->buf[i+2],
(无符号整数)lpBuffers->buf[i+3],(无符号整数)lpBuffers->buf[i+4],(无符号整数)lpBuffers->buf[i+5],
(无符号整数)lpBuffers->buf[i+6],(无符号整数)lpBuffers->buf[i+7],
(可绘图((无符号整数)lpBuffers->buf[i])?(无符号整数)lpBuffers->buf[i]:',
(可绘图((无符号整数)lpBuffers->buf[i+1])?(无符号整数)lpBuffers->buf[i+1]:',
(可绘图((无符号整数)lpBuffers->buf[i+2])?(无符号整数)lpBuffers->buf[i+2]:',
(可绘图((无符号整数)lpBuffers->buf[i+3])?(无符号整数)lpBuffers->buf[i+3]:',
(可绘图((无符号整数)lpBuffers->buf[i+4])?(无符号整数)lpBuffers->buf[i+4]:',
(可绘图((无符号整数)lpBuffers->buf[i+5])?(无符号整数)lpBuffers->buf[i+5]:',
(可绘图((无符号整数)lpBuffers->buf[i+6])?(无符号整数)lpBuffers->buf[i+6]:',
(可绘图((无符号整数)lpBuffers->buf[i+7])?(无符号整数)lpBuffers->buf[i+7]:');
}
printf(“\n\n”);
}
返回(oWSASend)(s,lpBuffers,dwBufferCount,lpNumberOfBytesSent,dwFlags,lpOverlapped,lpCompletionRoutine);
}
布尔可绘制(无符号整数值)
{
如果(值>32&&值<127)
返回true;
其他的
返回false;
}

您选错了类型。

您只想更改符号性,但也要将每个字节扩展为一个四字节字。如果存在有符号到无符号的转换(以及由此产生的负值环绕),这将导致一个异常高的值


lpBuffers->buf[i]
的每个“元素”都是一个
char
,但您要强制转换为
无符号int
。如果您的
char
已在系统上签名,则
0xDD
不在类型范围的顶部,因此它会转到
-35
。然后将其强制转换为
unsigned int
将导致
0xffffdd

printf
说明符
%02X
不会截断它

您可能希望将所有字节解释为
无符号
,以获得完整的
0x00
→<代码>0xFF范围。就我个人而言,我将转换为
无符号字符
(而不是
无符号整数
),其
0xDD
的值为
221

在下面的代码中,我还对循环条件进行了安全调整

for (unsigned int i = 0; i < lpBuffers->len-8; i = i + 8)
//                                         ^^
{
    printf(
        "%02X %02X %02X %02X %02X %02X %02X %02X"
          "\t\t%c %c %c %c %c %c %c %c\n",

        static_cast<unsigned char>(lpBuffers->buf[i]),
        static_cast<unsigned char>(lpBuffers->buf[i+1]),
        static_cast<unsigned char>(lpBuffers->buf[i+2]),
        static_cast<unsigned char>(lpBuffers->buf[i+3]),
        static_cast<unsigned char>(lpBuffers->buf[i+4]),
        static_cast<unsigned char>(lpBuffers->buf[i+5]),
        static_cast<unsigned char>(lpBuffers->buf[i+6]),
        static_cast<unsigned char>(lpBuffers->buf[i+7]),
        (drawable(lpBuffers->buf[i]))   ? static_cast<unsigned char>(lpBuffers->buf[i])   : '.',
        (drawable(lpBuffers->buf[i+1])) ? static_cast<unsigned char>(lpBuffers->buf[i+1]) : '.',
        (drawable(lpBuffers->buf[i+2])) ? static_cast<unsigned char>(lpBuffers->buf[i+2]) : '.',
        (drawable(lpBuffers->buf[i+3])) ? static_cast<unsigned char>(lpBuffers->buf[i+3]) : '.',
        (drawable(lpBuffers->buf[i+4])) ? static_cast<unsigned char>(lpBuffers->buf[i+4]) : '.',
        (drawable(lpBuffers->buf[i+5])) ? static_cast<unsigned char>(lpBuffers->buf[i+5]) : '.',
        (drawable(lpBuffers->buf[i+6])) ? static_cast<unsigned char>(lpBuffers->buf[i+6]) : '.',
        (drawable(lpBuffers->buf[i+7])) ? static_cast<unsigned char>(lpBuffers->buf[i+7]) : '.'
    );
}
for(无符号整数i=0;ilen-8;i=i+8)
//                                         ^^
{
printf(
%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X
“\t\t%c%c%c%c%c%c%c%c%c\n”,
静态_cast(lpBuffers->buf[i]),
静态_转换(lpBuffers->buf[i+1]),
静态_转换(lpBuffers->buf[i+2]),
静态_转换(lpBuffers->buf[i+3]),
静态_转换(lpBuffers->buf[i+4]),
静态_转换(lpBuffers->buf[i+5]),
静态_转换(lpBuffers->buf[i+6]),
静态_转换(lpBuffers->buf[i+7]),
(可绘制(lpBuffers->buf[i])?静态_转换(lpBuffers->buf[i]):',
(可绘制(lpBuffers->buf[i+1])?静态_转换(lpBuffers->buf[i+1]):',
(可绘制(lpBuffers->buf[i+2])?静态_转换(lpBuffers->buf[i+2]):',
(可绘制(lpBuffers->buf[i+3])?静态_转换(lpBuffers->buf[i+3]):',
(可绘制(lpBuffers->buf[i+4])?静态_转换(lpBuffers->buf[i+4]):',
(可绘制(lpBuffers->buf[i+5])?静态(lpBuffers->buf[i+5]):',
(可绘制(lpBuffers->buf[i+6])?静态_转换(lpBuffers->buf[i+6]):',
(可绘制(lpBuffers->buf[i+7])?静态_转换(lpBuffers->buf[i+7]):'。'
);
}

是否正在举办“年度最佳印刷品”大赛?如果是这样,我可能会赢,我知道这不是最好的方式,但我想不出更好的方式way@MartinJames:没那么糟…@LightnessRacesinOrbit-我没有回答这个问题,所以我求助于一点圣诞节的乐趣。虽然这个问题有点有趣,但我还是对它投了更高的票。即使不将它们强制转换为unsigned int,问题也是一样的,我不知道为什么我的数据流中会有负值。。通常不应该有any@user3125183:再读一遍。您应该强制转换为
无符号字符
。有符号数据类型的负值变为无符号数据类型的高正值。。。而且,至关重要的是,反之亦然。嗯,至少你的“版本”我的printf看起来更好:我会尝试一下,谢谢。。。。嗯,是的,当然是无符号整数。。4字节。。。我早该想到的哦,去吧,我会帮你过圣诞节的。
for (unsigned int i = 0; i < lpBuffers->len-8; i = i + 8)
//                                         ^^
{
    printf(
        "%02X %02X %02X %02X %02X %02X %02X %02X"
          "\t\t%c %c %c %c %c %c %c %c\n",

        static_cast<unsigned char>(lpBuffers->buf[i]),
        static_cast<unsigned char>(lpBuffers->buf[i+1]),
        static_cast<unsigned char>(lpBuffers->buf[i+2]),
        static_cast<unsigned char>(lpBuffers->buf[i+3]),
        static_cast<unsigned char>(lpBuffers->buf[i+4]),
        static_cast<unsigned char>(lpBuffers->buf[i+5]),
        static_cast<unsigned char>(lpBuffers->buf[i+6]),
        static_cast<unsigned char>(lpBuffers->buf[i+7]),
        (drawable(lpBuffers->buf[i]))   ? static_cast<unsigned char>(lpBuffers->buf[i])   : '.',
        (drawable(lpBuffers->buf[i+1])) ? static_cast<unsigned char>(lpBuffers->buf[i+1]) : '.',
        (drawable(lpBuffers->buf[i+2])) ? static_cast<unsigned char>(lpBuffers->buf[i+2]) : '.',
        (drawable(lpBuffers->buf[i+3])) ? static_cast<unsigned char>(lpBuffers->buf[i+3]) : '.',
        (drawable(lpBuffers->buf[i+4])) ? static_cast<unsigned char>(lpBuffers->buf[i+4]) : '.',
        (drawable(lpBuffers->buf[i+5])) ? static_cast<unsigned char>(lpBuffers->buf[i+5]) : '.',
        (drawable(lpBuffers->buf[i+6])) ? static_cast<unsigned char>(lpBuffers->buf[i+6]) : '.',
        (drawable(lpBuffers->buf[i+7])) ? static_cast<unsigned char>(lpBuffers->buf[i+7]) : '.'
    );
}