2013-12-21 4 views
4

http://prntscr.com/2ctnozC++ Странная шестигранной свалка WSASend Пакеты

Я закреплять функцию WSASend и сброса пакетов. Дамп ASCII работает, но DEX Dump иногда показывает такие вещи, как вы можете видеть на экране (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; 
} 
+6

Существует ли какое-то соревнование «Печать года»? –

+0

если так, я бы, вероятно, выиграл, я знаю, что это не лучший способ сделать это, но я не мог думать о лучшем способе – LemoniscooL

+0

@MartinJames: Это не * что * плохо ... –

ответ

3

Вы кастинг на неправильный тип.

Вы хотите изменить подпись, но вы также расширяете каждый байт до четырехбайтового слова. При наличии конвертирования без знака (и итогового отрицательного значения) это приводит к чудовищно высокой стоимости.


Каждый "элемент" из lpBuffers->buf[i] является char, но вы кастинг на unsigned int. Если ваш char подписан в вашей системе, то 0xDD находится в верхней части диапазона, поэтому он обтекает до -35. Затем литье до unsigned int результатов: 0xFFFFFFDD.

Спецификатор printf%02X не усекает это.

Предположительно, вы хотите интерпретировать все байты как unsigned, чтобы получить полный список 0xFF. Лично я бы конвертировал в 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]) : '.' 
    ); 
} 
+0

, даже если они не сбрасывают их в unsigned int, проблема такая же, и я не знаю, почему в моем потоке данных есть отрицательные значения. Обычно там не должно быть – LemoniscooL

+0

@ user3125183: Читайте снова. Вы должны использовать 'unsigned char'. Отрицательное значение для подписанного типа данных становится высоким положительным значением для неподписанного типа данных ... и, что особенно важно, - наоборот. –

+0

Хмм хорошо, по крайней мере, ваша «версия» моего printf выглядит лучше: D плохо дайте ей попробовать – LemoniscooL