Является ли С# Endian чувствительным?
Является ли С# когда-либо чувствительным к Endian, например, будет выглядеть так:
int a = 1234567;
short b = *(short*)&i;
всегда присваивать одно значение b. Если да, какое значение это будет?
Если нет, то какие хорошие способы борьбы с контентом, если код с указателями в?
Ответы
Ответ 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 на С#. Вы должны попробовать компилировать свой код, прежде чем спрашивать, что он будет делать.