2010-11-12 4 views
4

Little Endian против Big EndianLittle Endian - Big Endian Проблема

Big Endian = 0x31014950
Little Endian = 0x50490131

Однако с помощью этого метода

inline unsigned int endian_swap(unsigned int& x) 
{ 
return (((x & 0x000000FF) << 24) | 
     ((x & 0x0000FF00) << 8 ) | 
     ((x & 0x00FF0000) >> 8 ) | 
     ((x & 0xFF000000) >> 24)); 
} 

результат = 0x54110131
я провел много времени, пробуя множество подобных методов и даже библиотеку, такую ​​как

unsigned long _byteswap_ulong(unsigned long value); 

Но все же не повезло .. все возвращается тот же результат

EDIT
Я работаю над Little-Endian системы с Microsoft Visual Studio 2008
пример, как не следует за

int main() 
{ 
    unsigned int y = 0x31014950; 
    unsigned int r = endian_swap(y); 
    std::cout << r; 
} 

пример, размещенный на Ideone.com, является правильным .. но он не работает со мной

EDIT

std::cout << std::hex << r; 

Либо путь Pals .. Hex или нет это не получить номер Направо .. Либо Visual Studio получил серьезные ошибки в это отладчик или всю мою машину ..
Потому что я Заменил весь код с более медленной Redunant кода, но по-прежнему получать те же результаты
BTW, если это делает никакой разницы .. я использую отладчик Сломать после функции, чтобы проверить результат

+0

Вы используете возвращаемое значение, верно? Хотя вы берете 'x' по ссылке, вы никогда не изменяете его. –

+0

'endian_swap' выглядит отлично. И если заменить его на библиотечную функцию «возвращает тот же результат», возможно, ваша проблема находится где-то вне этой функции. – aschepler

+0

@ Джеймс заставлял меня думать, что вы даже не играете на значение 'x', вы делаете все обменивание ссылок. Это то, что вы на самом деле хотите? – BeemerGuy

ответ

1

Устранить амперсанд перед х в ваших рассуждениях спецификатор. Вы хотите передать значение.

+0

Не уверен, почему это было приостановлено. – John

+0

@John: Они не сказали, так что невозможно знать, но это даже не затрагивает проблему, о которой спросят. – 2010-11-13 03:09:49

+0

В какой-то момент неясно, применяется ли оно или нет, но я думаю, что мы выяснили, что это не вызвало проблемы. – John

2
  • Правильно ли вы печатаете результат?
  • Имеет ли значение тот факт, что вы передаете ссылку, а не значение?
+0

удалит refrence, сделайте разницу? потому что, по-видимому, это не так:/ – VirusEcks

+1

Обычно вы проходите по ссылке, если хотите изменить переданный параметр внутри функции. Кажется, вы не меняете 'x' вообще из своей функции, поэтому переход по значению делает ваше намерение более ясным (и, возможно, правильным). :) – John

+0

ОК, это не справочная вещь. Интересная проблема! – John

2

Ваш код выглядит правильным.

Следующая программа (http://ideone.com/a5TBF):

#include <cstdio> 

inline unsigned int endian_swap(unsigned const int& x) 
{ 
return (((x & 0x000000FF) << 24) | 
     ((x & 0x0000FF00) << 8 ) | 
     ((x & 0x00FF0000) >> 8 ) | 
     ((x & 0xFF000000) >> 24)); 
} 

int main() 
{ 
    unsigned int x = 0x12345678; 
    unsigned int y = endian_swap(x); 
    printf("%x %x\n", x, y); 
    return 0; 
} 

выходы:


Edit:
вам нужно std::cout << std::hex << r, в противном случае вы расходные тин (1) неправильная переменная, и (2) в десятичной системе :-)

Смотрите этот пример: http://ideone.com/EPFz8

+0

indeeed .. он работает с числами вроде этого .. но с этими шестнадцатеричными номерами он терпит неудачу .. – VirusEcks

+1

Это * есть * шестнадцатеричное число. :) Отсюда ** 0x ** 12345678 – John

+0

Сделал пример с вашим номером: http://ideone.com/Domrw – Vlad

0

Есть ли у вас блок-тестирование кода?

На моей платформе, это проходит:

void LittleEndianTest::testLittleEndian() 
{ 
    unsigned int x = 0x31014950; 
    unsigned int result = 
     (
      ((x & 0x000000FF) << 24) + 
      ((x & 0x0000FF00) << 8 ) + 
      ((x & 0x00FF0000) >> 8 ) + 
      ((x & 0xFF000000) >> 24) 
     ); 

    CPPUNIT_ASSERT_EQUAL((unsigned int)0x50490131, result); 
} 
0

Пример в вашем редактирования выводит у не т. Ввод y, конечно, не изменяется.

0

Если я запустил код, который вы отправили, он дает правильный результат: endian_swap (0x31014950) == 0x50490131.

Чтобы получить результат: endian_swap (0x31014950) == 0x54110131, ваш код должен быть эквивалентен следующему:

#define __ 
inline unsigned int endian_swap(unsigned int& x) 
{     //0x31014950 ->   0x54110131 
    return (((x & 0x000000FF) << 24) | // 50 
     __ ((x & 0x00F0F000) << 12) | // 4 
     __ ((x & 0x00FF0000) << 4 ) | // 1 
     __ ((x & 0x00FF0000) << 0 ) | //  1 
     __ ((x & 0x00FF0000) >> 8 ) | //  01 
     __ ((x & 0xFF000000) >> 24)); //  31   
} 

Проверьте вы не получили подобные различия в коде тоже.

+0

Мне интересно .. как это 12 .. а не умножить на 8? – VirusEcks

+1

Зачем использовать макрос? – 2010-11-13 03:08:33

+0

@Roger Я установил IDE для автоматического форматирования кода в 4 отступов, поэтому используйте его, если я хочу отформатировать вручную. –

0

Операторы битов не являются полезными, поскольку они работают так, как будто биты расположены в порядке от младшего значащего бита до самого значимого бита независимо от истинного внутреннего порядка байтов.

void isBigEndian() 
{ 
    void *number; 
    number = (int *) new int(0x01000010); 
    // 0x01000010 
    // 01 00 00 10          Hexadecimal 
    // 0 1  0 0  0 0  1 0 
    // 0000 0001 0000 0000 0000 0000 0001 0000 Bit 
    // 1   0   0   16   Decimal 
    char *byte; 
    byte = (char *)number; 
    cout << static_cast<int>(*byte);//prints 16: Little Endian 
} 

Вы меняете число выше и заставляете его возвращаться 1, когда он является BigEndian.

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