История изменений
Исправление Deleted, (текущая версия) :
Внутри функций а-ля h_to_be64(), h_to_le64() я бы применил #if __BIG_ENDIAN__ ...
.
Причем код
uint64_t h_to_le64(const uint64_t * n)
{
uint64_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); --i) {
out[i] = (*n >> (i * 8));
}
return rval;
}
по сути эквивалентен
uint64_t h_to_le64(const uint64_t * n)
{
#if __LITTLE_ENDIAN__
return *n;
#else
uint64_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); --i) {
out[i] = (*n >> (i * 8));
}
return rval;
#endif
}
Условная компиляция только для оптимизации, но семантика не меняется. Все, мы имеем удобные, довольно прозрачные и при этом оптимальные функции, абстрагирующие нас от хост-архитектуры.
UPD ну, и код для be
uint64_t h_to_be64(const uint64_t * n)
{
#if __BIG_ENDIAN__
return *n;
#else
uint64_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); ++i) {
out[sizeof(rval) - 1 - i] = (*n >> (i * 8));
}
return rval;
#endif
}
Исправление Deleted, :
Внутри функций а-ля h_to_be64(), h_to_le64() я бы применил #if __BIG_ENDIAN__ ...
.
Причем код
uint64_t h_to_le64(const uint64_t * n)
{
uint64_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); --i) {
out[i] = (*n >> (i * 8));
}
return rval;
}
по сути эквивалентен
uint64_t h_to_le64(const uint64_t * n)
{
#if __LITTLE_ENDIAN__
return *n;
#else
uint64_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); --i) {
out[i] = (*n >> (i * 8));
}
return rval;
#endif
}
Условная компиляция только для оптимизации, но семантика не меняется. Все, мы имеем удобные, довольно прозрачные и при этом оптимальные функции, абстрагирующие нас от хост-архитектуры.
UPD ну, и код для be
uint64_t h_to_be64(const uint64_t * n)
{
#if __BIG_ENDIAN__
return *n;
#else
uint32_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); ++i) {
out[sizeof(rval) - 1 - i] = (*n >> (i * 8));
}
return rval;
#endif
}
Исправление Deleted, :
Внутри функций а-ля h_to_be64(), h_to_le64() я бы применил #if __BIG_ENDIAN__ ...
.
Причем код
uint64_t h_to_le64(const uint64_t * n)
{
uint64_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); --i) {
out[i] = (*n >> (i * 8));
}
return rval;
}
по сути эквивалентен
uint64_t h_to_le64(const uint64_t * n)
{
#if __LITTLE_ENDIAN__
return *n;
#else
uint64_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); --i) {
out[i] = (*n >> (i * 8));
}
return rval;
#endif
}
Условная компиляция только для оптимизации, но семантика не меняется. Все, мы имеем удобные, довольно прозрачные и при этом оптимальные функции, абстрагирующие нас от хост-архитектуры.
UPD не, и код для be
uint64_t h_to_be64(const uint64_t * n)
{
#if __BIG_ENDIAN__
return *n;
#else
uint32_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); ++i) {
out[sizeof(rval) - 1 - i] = (*n >> (i * 8));
}
return rval;
#endif
}
Исходная версия Deleted, :
Внутри функций а-ля h_to_be64(), h_to_le64() я бы применил #if __BIG_ENDIAN__ ...
.
Причем код
uint64_t h_to_le64(const uint64_t * n)
{
uint64_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); --i) {
out[i] = (*n >> (i * 8));
}
return rval;
}
по сути эквивалентен
uint64_t h_to_le64(const uint64_t * n)
{
#if __LITTLE_ENDIAN__
return *n;
#else
uint64_t rval;
uint8_t * const out = (uint8_t *)&rval;
for(int i = 0; i < sizeof(rval); --i) {
out[i] = (*n >> (i * 8));
}
return rval;
#endif
}
Условная компиляция только для оптимизации, но семантика не меняется. Все, мы имеем удобные, довольно прозрачные и при этом оптимальные функции, абстрагирующие нас от хост-архитектуры.