LINUX.ORG.RU

История изменений

Исправление 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
}

Условная компиляция только для оптимизации, но семантика не меняется. Все, мы имеем удобные, довольно прозрачные и при этом оптимальные функции, абстрагирующие нас от хост-архитектуры.