6

C++でこのようなコードを取得したとしましょう。

void * target
uint32 * decPacket = (uint32 *)target;

したがって、C#では次のようになります。

byte[] target;
UInt32[] decPacket = (UInt32[])target;

タイプbyte[]をuint[]に変換できません

C ++が配列に行うこのメモリアラインメントをC#に変換するにはどうすればよいですか?

4

6 に答える 6

12

まあ、近いものを使用することBuffer.BlockCopyです:

uint[] decoded = new uint[target.Length / 4];
Buffer.BlockCopy(target, 0, decoded, 0, target.Length);

の最後の引数BlockCopyは、コピーするタイプに関係なく、常にコピーするバイト数であることに注意してください。

byte配列をC#の配列として扱うことはできませんuint(少なくとも安全なコードではありません。安全でないコードではわかりません)-しかし、配列の内容を配列にBuffer.BlockCopyスプラットします...結果をシステムのエンディアンに基づいて決定されます。個人的には、私はこのアプローチのファンではありません。別のメモリレイアウトのシステムに移動すると、コードでエラーが発生しやすくなります。私は自分のプロトコルで明示的にすることを好みます。うまくいけば、この場合でもお役に立てば幸いです。byteuint

于 2011-09-02T20:31:49.123 に答える
2

ダークサイドに移動したい場合は、ケーキ持って(割り当てを避けて)、それを食べることもできます(繰り返しを避けてください)。

float[]をbyte[]に、またはその逆に変換する方法を示す、関連する質問への私の回答を確認してください。float[]をbyte[]に変換する最速の方法は何ですか。

于 2012-03-12T11:37:57.610 に答える
1

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++
}

私は個人的にコピーを作成することを好みますが、実際にデータをコピーすることを避ける必要がある場合は、これにより(安全でない状況で)作業することができます。

于 2011-09-02T20:39:09.800 に答える
0

を使用できますBuffer.BlockCopy。ではなくArray.CopyBlockCopy配列型が完全に互換性があることを確認せずにバイトレベルのコピーを実行します。

そのようです:

uint[] array = new uint[bytes.Length/4];
Buffer.BlockCopy(bytes, 0, array, 0, bytes.Length);
于 2011-09-02T20:32:04.223 に答える
0

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);

それは私にとってはうまくいくようです。

于 2020-10-23T08:30:39.227 に答える
-1

すべての配列項目をループし、それぞれに対して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

于 2011-09-02T20:36:23.790 に答える