Большой и маленький порядковый вопрос - PullRequest
1 голос
/ 06 апреля 2010

У меня есть следующий код:

    // Incrementer
    datastores.cmtDatastores.u32Region[0] += 1;

    // Decrementer
    datastores.cmtDatastores.u32Region[1] = (datastores.cmtDatastores.u32Region[1] == 0) ? 
        10 : datastores.cmtDatastores.u32Region[1] - 1;

    // Toggler
    datastores.cmtDatastores.u32Region[2] = 
        (datastores.cmtDatastores.u32Region[2] == 0x0000) ? 
        0xFFFF : 0x0000;

Массив u32Region является массивом без знака int, который является частью структуры.Позже в коде я преобразую этот массив в формат Big Endian:

unsigned long  *swapL = (unsigned long*)&datastores.cmtDatastores.u32Region[50];
for (int i=0;i<50;i++) 
{
   swapL[i] = _byteswap_ulong(swapL[i]);
}

Весь этот фрагмент кода является частью цикла, который повторяется бесконечно.Это искусственная программа, которая увеличивает один элемент, уменьшает другой и переключает третий элемент.Затем массив отправляется через TCP на другой компьютер, который распаковывает эти данные.

Первый цикл работает нормально.После этого, поскольку данные в формате с прямым порядком байтов, когда я "увеличиваю", "уменьшаю" и "переключаюсь", значения неверны.Очевидно, что если в первом цикле datastores.cmtDatastores.u32Region[0] += 1; приводит к 1, то во втором цикле это должно быть 2, но это не так.Это прибавление числа 1 (little-endian) к числу в datastores.cmtDatastores.u32Region[0] (big endian).

Я полагаю, мне нужно вернуться к little-endian в начале каждого цикла, но, похоже, чтобыть более простым способом сделать это.

Есть мысли?

Спасибо,

Бобби

Ответы [ 2 ]

4 голосов
/ 06 апреля 2010

Я думаю о проблемах с порядком байтов: я думаю, что есть числа (когда они в порядке байтов машины), а также есть двоичные объекты двоичных данных (когда они не в порядке байтов машины).

Когда вы думаете так, вы понимаете, что не можете увеличить двоичный объект двоичных данных (или выполнить какие-либо числовые операции с ними). Единственное, что вы можете с ними сделать - это записать необработанные данные или преобразовать их в число.

Если вы хотите выполнять числовые операции, данные должны быть числом, поэтому они должны быть в порядке байтов машины.

1 голос
/ 06 апреля 2010

Если данные всегда должны быть бигендинговыми для отправки по TCP, то, возможно, было бы проще оставить данные в массиве, как всегда, в бигендовом порядке, и выполнять байт-своп при выполнении операций с данными.Приращение будет считано из массива, byteswap (в littleEndian), приращение, byteswap (bigEndian), сохранено в массив.

...