2016-04-27 1 views
0

При преобразовании сетевых данных между большим и маленьким эндиантом, я понимаю, что мы меняем все байты, составляющие тип. Независимо от размера этого типа, мы меняем их таким образом, чтобы первый байт стал последним байтом, а последний байт становится первым байтом.
Это может быть выражено в общем с функцией ниже:При установке двойного байта в сетевом порядке, почему это делается в 4 байтовых кусках?

void SwapBytes(void *pv, size_t n) 
{ 
    char *p = pv; 
    size_t lo, hi; 
    for(lo=0, hi=n-1; hi>lo; lo++, hi--) 
    { 
     char tmp=p[lo]; 
     p[lo] = p[hi]; 
     p[hi] = tmp; 
    } 
} 

не обращая внимания на эффективность,
Я надеялся, что это будет работать на любых данных type-- включая IEEE 754 дублей.


Затем я наткнулся на following post,
где пользователь поменялся байты двойной в 4-байтовых кусках:

void send_double(double d) { 
    long int i64 = *((reinterpret_cast<int *>)(&d)); /* Ugly, but works */ 
    int hiword = htonl(static_cast<int>(i64 >> 32)); 
    send(hiword); 
    int loword = htonl(static_cast<int>(i64)); 
    send(loword); 
} 

double recv_double() { 
    int hiword = ntohl(recv_int()); 
    int loword = ntohl(recv_int()); 
    long int i64 = (((static_cast<long int>) hiword) << 32) | loword; 
    return *((reinterpret_cast<double *>(&i64)); 
} 

Есть ли специальное правило об этом, когда речь идет о сетевой порядок байтов?
Сначала я подумал, что речь идет о замене 4 байта за раз, независимо от типа, но это не имеет смысла для uint16, где всего 2 байта.

Каков правильный способ преобразования байта IEEE 754 в сетевой порядок?
Включить ли я все 8 байтов или перевернуть каждую половину отдельно?

+0

@ M.M Код приходит непосредственно с другого сообщения. Главное, что я хотел отметить, заключается в том, что пользователь пытается перевернуть первые 4 байта двойника, за которым следуют последние 4 байта двойника вместо того, чтобы сбрасывать все 8 вместе. Я хочу знать, что правильно для сетевого байтового заказа. –

+0

Моим советом было бы опускать этот пост и игнорировать его содержание –

+0

@ M.M Great. Итак, SwapBytes будет работать на шортах, ints, float, doubleles, long longs и т. Д.? –

ответ

1

Каков правильный способ преобразования байта IEEE 754 в сетевой порядок?

Насколько я могу судить, нет стандартного байтового байта сети для удвоений IEEE754. По-видимому, люди перевернули свою сериализацию.

«Сетевой порядок байтов» изначально появился в контексте интернет-протокола, где было принято отправлять 32-битные значения (адреса IPv4) и 16-битные значения (например, номер порта). RFC 1700 первоначально определил термин, но RFC теперь obsoleted без замены.


Для связи с double, или любыми другими данными по этому вопросу, оба конца должен согласовать и следовать спецификациям в протокола. Это скажет, как кодируется double. Сообщение, с которым вы связались, предположительно следовало протоколу, в котором указывалось размещение байтов 64-битного формата IEEE754 в определенном порядке, который он показывал. Другие протоколы могут отличаться.

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