【问题标题】:C++ Strange hex dump of WSAsend PacketsWSAsend 数据包的 C++ 奇怪的十六进制转储
【发布时间】:2026-02-07 13:10:01
【问题描述】:

http://prntscr.com/2ctnoz

我正在连接一个 WSAsend 函数并转储数据包。 ASCII 转储有效,但 HEX 转储有时会显示您在屏幕上看到的内容(FFFFFFDD),知道为什么吗?

代码:

int WINAPI myWSASend(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesSent, DWORD dwFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{   
    //Packet Log
    if (bLogPacketS == TRUE)
    {
        for (unsigned int i = 0; i < lpBuffers->len; i = i + 8)
        {
            printf("%02X %02X %02X %02X %02X %02X %02X %02X\t\t%c %c %c %c %c %c %c %c\n",
                  (unsigned int)lpBuffers->buf[i], (unsigned int)lpBuffers->buf[i+1], (unsigned int)lpBuffers->buf[i+2],
                  (unsigned int)lpBuffers->buf[i+3], (unsigned int)lpBuffers->buf[i+4], (unsigned int)lpBuffers->buf[i+5],
                  (unsigned int)lpBuffers->buf[i+6], (unsigned int)lpBuffers->buf[i+7],
                  (drawable((unsigned int)lpBuffers->buf[i])) ? (unsigned int)lpBuffers->buf[i] : '.',
                  (drawable((unsigned int)lpBuffers->buf[i+1])) ? (unsigned int)lpBuffers->buf[i+1] : '.',
                  (drawable((unsigned int)lpBuffers->buf[i+2])) ? (unsigned int)lpBuffers->buf[i+2] : '.',
                  (drawable((unsigned int)lpBuffers->buf[i+3])) ? (unsigned int)lpBuffers->buf[i+3] : '.',
                  (drawable((unsigned int)lpBuffers->buf[i+4])) ? (unsigned int)lpBuffers->buf[i+4] : '.',
                  (drawable((unsigned int)lpBuffers->buf[i+5])) ? (unsigned int)lpBuffers->buf[i+5] : '.',
                  (drawable((unsigned int)lpBuffers->buf[i+6])) ? (unsigned int)lpBuffers->buf[i+6] : '.',
                  (drawable((unsigned int)lpBuffers->buf[i+7])) ? (unsigned int)lpBuffers->buf[i+7] : '.');
        }
        printf("\n\n");
    }
    return (oWSASend)(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine);
}

bool drawable(unsigned int value)
{
    if (value > 32 && value < 127)
        return true;
    else
        return false;
}

【问题讨论】:

  • 是否正在进行某种“年度 printf”比赛?
  • 如果是这样,我可能会赢,我知道这不是最好的方法,但我想不出更好的方法
  • @MartinJames:这不是坏...
  • @LightnessRacesinOrbit - 我对 OP 没有答案,所以我求助于一点圣诞乐趣。这个问题有点意思,所以我投了赞成票。

标签: c++ hex dump packets


【解决方案1】:

您投射到了错误的类型。

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


lpBuffers-&gt;buf[i] 的每个“元素”都是 char,但您正在转换为 unsigned int。如果您的char 已在您的系统上签名,则0xDD 不在类型范围的顶部,因此它会环绕到-35。然后将其转换为 unsigned int 会得到 0xFFFFFFDD

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

大概您希望将所有字节解释为unsigned,以获得完整的0x000xFF 范围。我个人会转换为unsigned char(而不是unsigned int),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]) : '.'
    );
}

【讨论】:

  • 即使不将它们转换为无符号整数,问题也是一样的,我不知道为什么我的数据流中有负值.. 通常不应该有任何
  • @user3125183:再读一遍。你应该投给unsigned char。有符号数据类型的负值变为无符号数据类型的高正值......而且,至关重要的是,反之亦然
  • 嗯,至少你的 printf 的“版本”看起来更好:我试试看
  • 像魅力一样工作,谢谢....好吧,是的,肯定是 unsigned int .. 4 字节...应该想到 <__>
  • 哦,去吧,圣诞节我送你上船。