4

これは単純なことかもしれませんが、簡単な方法を見つけることができないようです。84個のuintの配列をSQLデータベースのBINARYフィールドに保存する必要があります。したがって、C#ASP.NETプロジェクトでは次の行を使用しています。

//This is what I have
uint[] uintArray;

//I need to convert from uint[] to byte[]
byte[] byteArray = ???

cmd.Parameters.Add("@myBindaryData", SqlDbType.Binary).Value = byteArray;

では、どのようにしてuint[]からbyte[]に変換しますか?

4

5 に答える 5

9

どうですか:

byte[] byteArray = uintArray.SelectMany(BitConverter.GetBytes).ToArray();

これにより、リトルエンディアン形式で必要な処理が実行されます...

于 2011-11-07T04:24:00.487 に答える
5

System.Buffer.BlockCopyを使用して、これを行うことができます。

byte[] byteArray = new byte[uintArray.Length * 4];
Buffer.BlockCopy(uintArray, 0, byteArray, 0, uintArray.Length * 4];

http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx

これは、forループまたは同様の構造を使用するよりもはるかに効率的です。最初の配列から2番目の配列にバイトを直接コピーします。

逆に変換するには、同じことを逆に実行します。

于 2011-11-07T04:40:49.093 に答える
3

これを行うための組み込みの変換関数はありません。配列の動作方法により、まったく新しい配列を割り当て、その値を入力する必要があります。あなたはおそらくそれを自分で書く必要があるでしょう。このSystem.BitConverter.GetBytes(uint)関数を使用して一部の作業を実行し、結果の値をfinalにコピーできますbyte[]

リトルエンディアン形式で変換を行う関数は次のとおりです。

    private static byte[] ConvertUInt32ArrayToByteArray(uint[] value)
    {
        const int bytesPerUInt32 = 4;
        byte[] result = new byte[value.Length * bytesPerUInt32];
        for (int index = 0; index < value.Length; index++)
        {
            byte[] partialResult = System.BitConverter.GetBytes(value[index]);
            for (int indexTwo = 0; indexTwo < partialResult.Length; indexTwo++)
                result[index * bytesPerUInt32 + indexTwo] = partialResult[indexTwo];
        }
        return result;
    }
于 2011-11-07T04:22:54.920 に答える
2
byte[] byteArray = Array.ConvertAll<uint, byte>(
    uintArray,
    new Converter<uint, byte>(
        delegate(uint u) { return (byte)u; }
    ));

@ liho1eyeからのアドバイスに注意してください。あなたのuintが本当にバイトに収まっていることを確認してください。そうでないと、データが失われます。

于 2011-11-07T04:23:05.263 に答える
0

各uintのすべてのビットが必要な場合は、適切なサイズのbyte []を作成し、各uintをそれが表す4バイトにコピーする必要があります。

このようなものが機能するはずです:

uint[] uintArray;

//I need to convert from uint[] to byte[]
byte[] byteArray = new byte[uintArray.Length * sizeof(uint)];
for (int i = 0; i < uintArray.Length; i++)
{
    byte[] barray = System.BitConverter.GetBytes(uintArray[i]);
    for (int j = 0; j < barray.Length; j++)
    {
          byteArray[i * sizeof(uint) + j] = barray[j];
    }
}
cmd.Parameters.Add("@myBindaryData", SqlDbType.Binary).Value = byteArray;
于 2011-11-07T04:31:32.493 に答える