Символ становится 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

Решение

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

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

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

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

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

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

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

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector