Вопрос с прямым порядком байтов и младшим порядком

У меня такой код:

    // 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 на другой компьютер, который распаковывает эти данные.

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

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

Есть предположения?

Спасибо,

Бобби


person Blade3    schedule 06.04.2010    source источник


Ответы (2)


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

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

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

person R Samuel Klatchko    schedule 06.04.2010

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

person dthorpe    schedule 06.04.2010