2013-12-08 3 views
0

Итак, я отправляю необработанные данные через сокет.Символ становится int при отправке через сокет

unsigned char data [] = {0xFA, 0xDE, 0xDB, 0xAD, 0x00, 0x00, 0x00, 0x06, 0x54, 0x65, 0x61, 0x67,0x61, 0x6E, 0x19, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x68, 0x6F, 0x77, 0x20, 0x61, 0x72, 0x65, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x66, 0x62, 0x67, 0x67, 0x6F, 0x74, 0x3F }; 

заканчивается тем же самым.

, но при его получили это заканчивается, как этот

fffffffa ffffffde ffffffdb ffffffad 0 0 0 6 54 65 61 67 61 6e 19 48 65 6c 6c 6f 20 68 6f 77 20 61 72 65 20 79 6f 75 20 66 62 67 67 6f 74 3f 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

Обратите внимание, как первые 4 байта в исходном изменения в 16 байт.

Любая идея, что вызывает это?

Маленький код

char data[512]; 
if (socket.Receive(address, data, sizeof(data))){ 
    char *point = data; 
    if ((unsigned int) *point == 0xFADEDBAD) 
      fprintf(stderr, " WIN \n"); 

/////////////////////// Приемный ФУНКЦИЯ СВЫШЕ //////// ///////////

  int Receive(Address & sender, void * data, int size) 
      { 
        assert(data); 
        assert(size > 0); 

        if (socket == 0) 
          return false; 


        #if PLATFORM == PLATFORM_WINDOWS 
        typedef int socklen_t; 
        #endif 

        sockaddr_in from; 
        socklen_t fromLength = sizeof(from); 

        int received_bytes = recvfrom(socket, (char*)data, size, 0, (sockaddr*)&from, &fromLength); 

        if (received_bytes <= 0) 
          return 0; 

        unsigned int address = ntohl(from.sin_addr.s_addr); 
        unsigned int port = ntohs(from.sin_port); 

        sender = Address(address, port); 

        return received_bytes; 
      } 

    private: 

      int socket; 
    }; 

}

//////// КАК данные передаются ///////////// /////

unsigned char data [] = {0xFA, 0xDE, 0xDB, 0xAD, 0x00, 0x00, 0x00, 0x06, 0x54, 0x65, 0x61, 0x67,0x61, 0x6E, 0x19, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x68, 0x6F, 0x77, 0x20, 0x61, 0x72, 0x65, 0x20, 0x79, 0x6F, 0x75, 0x20, 0x66, 0x61, 0x67, 0x67, 0x6F, 0x74, 0x3F }; 

socket.Send (address, (char*)data, sizeof (data) ); 

//////////////// МЕТОД ////////////////

bool Send(const Address & destination, const void * data, int size) 
      { 
        assert(data); 
        assert(size > 0); 

        if (socket == 0) 
          return false; 

        sockaddr_in address; 
        address.sin_family = AF_INET; 
        address.sin_addr.s_addr = htonl(destination.GetAddress()); 
        address.sin_port = htons((unsigned short) destination.GetPort()); 

        int sent_bytes = sendto(socket, (const char*)data, size, 0, (sockaddr*)&address, sizeof(sockaddr_in)); 

        return sent_bytes == size; 
      } 
+0

как вы пишете байты? можете ли вы опубликовать фрагмент кода? – alexgirao

+0

Просто догадка: пятый символ имеет значение null. может закончиться ваш массив ... – MeNa

ответ

2

Это не сокет, который преобразования символов в int, это вы, когда получаете их в подписанные (! вы не объявляете данные без знака!). Вы не показывают ту часть, где вы выводите «плохие» шестнадцатиричное значение, но я предполагаю, что это что-то вроде

printf("%02x", data[i]) 

, который принимает (подписанную!) Характер в данных [я], преобразует его в 4 байта целое число (которое может иметь значение от -128 до 127, 0xffffff80 до 0x0000007f в шестнадцатеричном формате), затем выводить это целое число.

Объявление «unsigned char data [512]» на принимающей стороне будет исправлять это.

Кроме того, ваш

if ((unsigned int) *point == 0xFADEDBAD) 

неправильно, он должен читать

if (*(unsigned int *) point == 0xFADEDBAD) 

Вы не то, что использовать * точку доступа к (1-байт) символ, а затем преобразовать этот символ to int; вы хотите преобразовать указатель в указатель, который указывает на целое число 4 байта, затем получить доступ к этим 4 байтам через указатель.

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

+0

Большое спасибо. Пропустил подписанный символ, и это было затормозило XD, у всех нас есть свои моменты. – PhobicHD

+0

Предполагая, что это не будет верно, так как тип punning, как это даст вам '0xaddbdefa'. –

Смежные вопросы