为什么BitConverter.如果数据没有按照给定的偏移量对齐,ToInt32每次读取一个字节
本文关键字:读取 ToInt32 字节 一个 对齐 偏移量 数据 如果 BitConverter 为什么 | 更新日期: 2023-09-27 18:10:01
很抱歉这个标题让人困惑,但我想不出更好的方式来解释它。
最近在浏览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;
}
}
编辑:这是有问题的代码段
我敢打赌这与5.0版c#规范(强调我的)中§18.4的这一部分有关:
当一个指针类型转换为另一个指针类型时,如果结果指针没有正确对齐为指向类型,如果结果被解引用,则行为未定义。
在"unaligned"情况下按字节复制是为了避免依赖于明确未定义的行为。