1

.NET4.0
の使用dotPeek.NETデコンパイラーの使用

System.BitConverter.ToInt32()のコードと少し混同されています:

public static unsafe int ToInt32(byte[] value, int startIndex)
    {
      if (value == null)
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.value);
      if ((long) (uint) startIndex >= (long) value.Length)
        ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.startIndex, ExceptionResource.ArgumentOutOfRange_Index);
      if (startIndex > value.Length - 4)
        ThrowHelper.ThrowArgumentException(ExceptionResource.Arg_ArrayPlusOffTooSmall);
      fixed (byte* numPtr = &value[startIndex])
      {
        if (startIndex % 4 == 0)
          return *(int*) numPtr;
        if (BitConverter.IsLittleEndian)
          return (int) *numPtr | (int) numPtr[1] << 8 | (int) numPtr[2] << 16 | (int) numPtr[3] << 24;
        else
          return (int) *numPtr << 24 | (int) numPtr[1] << 16 | (int) numPtr[2] << 8 | (int) numPtr[3];
      }
    }

コードのこの部分を理解する方法は?:

if (startIndex % 4 == 0)
  return *(int*) numPtr;

バイト配列の開始位置が重要なのはなぜですか?

4

1 に答える 1

3

numPtrは、32ビット値が格納されているバイト配列内の場所を指します。

このアドレスが4バイトにアラインされている場合は、整数へのキャストを介して直接読み取ることができます。バイトポインターは整数ポインターに変換され、それが差分されます。

それ以外の場合は、各バイトを個別に読み取ってから、合計して32ビット整数にする必要があります。これは、ほとんどのCPUは、4バイトにアラインされている場合にのみ4バイトの値を直接読み取ることができるためです。

于 2013-01-06T05:31:38.800 に答える