2013-08-16 3 views
0

У меня есть двухбайтовый короткий указатель int short int* hostdata и вы хотите преобразовать его в 4-байтовый беззнаковый int с сетевым порядком байтов unsigned int* net_data. Это нормально, если я пишу это так:short int to unsigned int by byte order by C++

for(int i = 0; i < numsamples; ++i) 
    net_data[i] = htonl((unsigned int)hostdata[i]); 

или я должен делать это с reinterpret_cast как:

for(int i = 0; i < numsamples; ++i) 
    net_data[i] = htonl(reinterpret_cast<unsigned int *>(reinterpret_cast<short int*>hostdata[i])); 
+0

Ваши 2 примера кода, похоже, не эквивалентны мне, поскольку вы применяете указатели в вашем примере секунд без разыменования - предназначено? Кроме того, какое преобразование вы хотите достичь? short int может иметь отрицательные числа, unsigned int не может - вы предпочли бы нижнее течение в этом случае? усечение? переосмысление? – griffin

+0

Что вы хотите делать с отрицательными значениями? –

+0

У вас есть массив указателей, 'short int * hostdata [SIZE]' или массив чисел 'short int hostdata [SIZE]'? Если последнее, что вы хотите делать с отрицательными цифрами? – Joni

ответ

0

Если вы используете short integers, то зачем использовать htonl, когда вы можете использовать htons.

  • Htonl обозначает хост к сети длиной

  • htons обозначает хост к сети короткой

Помните, что почти все комбинации Н, N, L, S существуют, за исключением глупые, такие как stonhl

Не переутомляйте вещи, добавляйте их в структуру и отправляйте их как таковые.

+0

На самом деле я пытаюсь сохранить данные в формате 2 байта (короткий int) в 4-байтовый формат (int). Разве я не должен использовать htonl для этого? –

+0

@AvbAvb Используйте 'struct', чтобы удерживать' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', ' –