Извините за запутанный заголовок, но я не могу придумать лучшего способа объяснить это.
При просмотре исходного кода BitConverter
недавно я наткнулся на странный фрагмент кода:
public static unsafe int ToInt32(byte[] value, int startIndex)
{
fixed (byte* pbyte = &value[startIndex])
{
if (startIndex % 4 == 0) // data is aligned
return *((int*)pbyte);
else
{
if (IsLittleEndian)
{
return (*pbyte) | (*(pbyte + 1) << 8) | (*(pbyte + 2) << 16) | (*(pbyte + 3) << 24);
}
else
{
return (*pbyte << 24) | (*(pbyte + 1) << 16) | (*(pbyte + 2) << 8) | (*(pbyte + 3));
}
}
}
}
Как приведение pbyte
к int*
(строка 6) может нарушить выравнивание данных в этом сценарии? Я оставил это для краткости, но в коде есть надлежащая проверка аргументов, поэтому я почти уверен, что это не может быть нарушением доступа к памяти. Теряет ли он точность при броске?
Другими словами, почему код нельзя упростить до:
public static unsafe int ToInt32(byte[] value, int startIndex)
{
fixed (byte* pbyte = &value[startIndex])
{
return *(int*)pbyte;
}
}
Изменить: Здесь находится рассматриваемый фрагмент кода.
pbyte + 1
,pbyte + 2
и т. д. (3 из которых не будут выровнены) только для того, чтобы избежать этого невыравнивания. Мне кажется довольно излишним. - person James Ko   schedule 26.08.2015int
- stackoverflow.com/questions/1237963/ - так какую альтернативную реализацию вы предлагаете по сравнению с побайтовым чтением? - person Alexei Levenkov   schedule 26.08.2015