Подтвердить что ты не робот

Является ли С# Endian чувствительным?

Является ли С# когда-либо чувствительным к Endian, например, будет выглядеть так:

int a = 1234567;
short b = *(short*)&i;

всегда присваивать одно значение b. Если да, какое значение это будет?

Если нет, то какие хорошие способы борьбы с контентом, если код с указателями в?

4b9b3361

Ответ 1

С# не определяет endianness. На самом деле, да, вероятно, это будет всегда малоинтенсивным (IIRC даже на IA64, но я не проверял), но вы должны в идеале проверить BitConverter.IsLittleEndian, если сущность важна, или просто использовать бит-сдвиг и т.д., А не прямую память доступ.

Чтобы процитировать несколько строк из protobuf-net (сборка еще не выполнена):

WriteInt64(*(long*)&value);
if (!BitConverter.IsLittleEndian)
{   // not fully tested, but this *should* work
    Reverse(ioBuffer, ioIndex - 8, 8);
}

то есть. он проверяет соответствие и делает флип при необходимости.

Ответ 2

Да, я считаю, что код чувствителен к суждению. Значение b будет наименее значимым байтами на процессоре little-endian и наиболее значительными байтами на процессоре большого числа. Чтобы сделать это проще, перейдите в hex:

using System;

class Test
{
    unsafe static void Main()
    {
        int a = 0x12345678;
        short b = *(short*)&a;
        Console.WriteLine(b.ToString("x"));
    }
}

В моем поле x86, которое печатает "5678", показывая, что наименее значимые байты находились в "начале" vaue a. Если вы запускаете тот же код на процессоре, работающем в режиме "большой" (возможно, в Mono), я ожидаю, что он напечатает "1234".

Ответ 3

Насколько я могу судить, ни спецификации С#, ни спецификаций Common Language Infrastructure не имеют требований к четкости для побитовых и математических операций на основе указателя. CLI заявляет, что двоичные данные, хранящиеся в исполняемом файле MSIL, должны быть в формате little endian. И общий дрейф документов указывает, что код не должен зависеть от какого-либо определенного представления памяти (включая упакованные или распакованные массивы и т.д.), За исключением особых случаев.

Ответ 4

Вы действительно не должны делать указатель swizzling на С#. Вы должны попробовать компилировать свой код, прежде чем спрашивать, что он будет делать.