Я был так счастлив, когда обнаружил поле IsLittleEndian
в BitConverter
. Я подумал, конечно, что он должен быть там, и я смогу указать любой порядок байтов, который мне нравится. Что ж, мое счастье длилось недолго. Потратил некоторое время, пока не обнаружил, что нет возможности установить поле.
Это поле только для чтения
, и только в статическом конструкторе установлено значение true
:
static BitConverter()
{
IsLittleEndian = true;
}
Забавно, что это поле действительно используется в коде. Например, реализация метода ToInt32
выглядит так:
if (IsLittleEndian)
{
return (((numRef[0] | (numRef[1] << 8)) | (numRef[2] << 0x10)) | (numRef[3] << 0x18));
}
return ((((numRef[0] << 0x18) | (numRef[1] << 0x10)) | (numRef[2] << 8)) | numRef[3]);
Похоже, что ToInt32
отлично справляется как с малым, так и с большим порядком байтов.
Мой вопрос: как это произошло это очень полезный фрагмент кода, который уже реализован и находится в FCL, но его нельзя использовать (если, конечно, вы не начнете возиться с отражением)? Это просто потому, что некоторые разработчики не уложились в срок и оставили работу наполовину? Даже если так, почему код недоступен, а поле есть? Я надеюсь, что для этого есть веская причина.
Я хочу пояснить. Мне не нужно решение о том, как обрабатывать значения с прямым порядком байтов. У меня есть решение. Решение фактически показано в моем вопросе.