C++でこのようなコードを取得したとしましょう。
void * target
uint32 * decPacket = (uint32 *)target;
したがって、C#では次のようになります。
byte[] target;
UInt32[] decPacket = (UInt32[])target;
タイプbyte[]をuint[]に変換できません
C ++が配列に行うこのメモリアラインメントをC#に変換するにはどうすればよいですか?
まあ、近いものを使用することBuffer.BlockCopy
です:
uint[] decoded = new uint[target.Length / 4];
Buffer.BlockCopy(target, 0, decoded, 0, target.Length);
の最後の引数BlockCopy
は、コピーするタイプに関係なく、常にコピーするバイト数であることに注意してください。
byte
配列をC#の配列として扱うことはできませんuint
(少なくとも安全なコードではありません。安全でないコードではわかりません)-しかし、配列の内容を配列にBuffer.BlockCopy
スプラットします...結果をシステムのエンディアンに基づいて決定されます。個人的には、私はこのアプローチのファンではありません。別のメモリレイアウトのシステムに移動すると、コードでエラーが発生しやすくなります。私は自分のプロトコルで明示的にすることを好みます。うまくいけば、この場合でもお役に立てば幸いです。byte
uint
ダークサイドに移動したい場合は、ケーキを持って(割り当てを避けて)、それを食べることもできます(繰り返しを避けてください)。
float[]をbyte[]に、またはその逆に変換する方法を示す、関連する質問への私の回答を確認してください。float[]をbyte[]に変換する最速の方法は何ですか。
Jonが述べたように、Buffer.BlockCopyはこれをコピーするのにうまく機能します。
ただし、これが相互運用シナリオであり、バイト配列に直接アクセスするuint[]
場合は、C ++アプローチに最も近い方法は、安全でないコードを使用することです。
byte[] target;
CallInteropMethod(ref target);
fixed(byte* t = target)
{
uint* decPacket = (uint*)t;
// You can use decPacket here the same way you do in C++
}
私は個人的にコピーを作成することを好みますが、実際にデータをコピーすることを避ける必要がある場合は、これにより(安全でない状況で)作業することができます。
を使用できますBuffer.BlockCopy
。ではなくArray.Copy
、BlockCopy
配列型が完全に互換性があることを確認せずにバイトレベルのコピーを実行します。
そのようです:
uint[] array = new uint[bytes.Length/4];
Buffer.BlockCopy(bytes, 0, array, 0, bytes.Length);
BitConverter.ToUInt32()を使用しました-https://docs.microsoft.com/en-us/dotnet/api/system.bitconverter.touint32?view=netcore- 3.1
byte[] source = new byte[n];
UInt32 destination;
destination = BitConverter.ToUInt32(source, 0);
それは私にとってはうまくいくようです。
すべての配列項目をループし、それぞれに対してConvert.ToUint32()を呼び出します。
Uint32[] res = new Uint32[target.Length];
for(int i = 0;i <= target.Length;i++)
{
res[i] = Convert.ToUint32(target[i]);
}
こちらがMSDNからの公式リンクです。 http://msdn.microsoft.com/en-us/library/469cwstk.aspx