При преобразовании сетевых данных между большим и маленьким эндиантом, я понимаю, что мы меняем все байты, составляющие тип. Независимо от размера этого типа, мы меняем их таким образом, чтобы первый байт стал последним байтом, а последний байт становится первым байтом.
Это может быть выражено в общем с функцией ниже:При установке двойного байта в сетевом порядке, почему это делается в 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 байтов или перевернуть каждую половину отдельно?
@ M.M Код приходит непосредственно с другого сообщения. Главное, что я хотел отметить, заключается в том, что пользователь пытается перевернуть первые 4 байта двойника, за которым следуют последние 4 байта двойника вместо того, чтобы сбрасывать все 8 вместе. Я хочу знать, что правильно для сетевого байтового заказа. –
Моим советом было бы опускать этот пост и игнорировать его содержание –
@ M.M Great. Итак, SwapBytes будет работать на шортах, ints, float, doubleles, long longs и т. Д.? –