5

私は C++ 開発者で、最近 WPF に取り組み始めました。アプリで Array.Copy() を使用していますが、目的の結果を完全に得ることができないようです。

C++ アプリで次のように実行しました。

static const signed char version[40] = {
'A', 'U', 'D', 'I', 'E', 'N', 'C', 'E',   // name
 0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,   // reserved,  firmware size
 0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,   // board number
 0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,   // variant, version, serial
 0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0     // date code, reserved
};

unsigned char sendBuf[256] = {};
int memloc = 0;
sendBuf[memloc++] = 0;
sendBuf[memloc++] = 0;

// fill in the audience header
memcpy(sendBuf+memloc, version, 8); // the first 8 bytes
memloc += 16; // the 8 copied, plus 8 reserved bytes

次のように、WPF (C#) アプリで同様の操作を行いました。

Byte[] sendBuf = new Byte[256];

char[] version = 
        {
                'A', 'U', 'D', 'I', 'E', 'N', 'C', 'E',         // name
                '0', '0', '0', '0', '0', '0', '0', '0' ,        // reserved,  firmware size
                '0', '0', '0', '0', '0', '0', '0', '0' ,        // board number
                '0', '0', '0', '0', '0', '0', '0', '0' ,        // variant, version, serial
                '0', '0', '0', '0', '0', '0', '0', '0'          // date code, reserved
        };

// fill in the address to write to -- 0
        sendBuf[memloc++] = 0;
        sendBuf[memloc++] = 0;

        // fill in the audience header
        Array.Copy(sendBuf + memloc, version, 8);   // the first 8 bytes
        memloc += 16;

Array.Copy(sendBuf + memloc, version, 8);しかし、 asでエラーが発生しOperator '+' cannot be applied to operands of type 'byte[]' and 'int'ます。

どうすればこれを達成できますか???? :) 助けてください :)

4

3 に答える 3

2
for(int i = 0; i < 8; i++)
{
    sendBuf[i+memloc] = Convert.ToSByte(version[i]);
}
于 2012-10-30T04:57:42.300 に答える
1

あなたのためにそれを翻訳しました。説明はインラインです。

var sendBuf = new byte[256];

// char in C# is a UTF-16 character (at least 2 bytes). Use byte[] here instead.
byte[] version = 
        {
                (byte)'A', (byte)'U', (byte)'D', (byte)'I', (byte)'E', (byte)'N', (byte)'C', (byte)'E',         // name
                0, 0, 0, 0, 0, 0, 0, 0,        // reserved,  firmware size
                0, 0, 0, 0, 0, 0, 0, 0,        // board number
                0, 0, 0, 0, 0, 0, 0, 0,        // variant, version, serial
                0, 0, 0, 0, 0, 0, 0, 0         // date code, reserved
        };

int memloc = 0;

sendBuf[memloc++] = 0;
sendBuf[memloc++] = 0;

// C# doesn't allow pointer arithmetic with arrays. memcpy's signature is also reversed.
Array.Copy(
   version,     // Source
   0,           // Index of Source
   sendBuf,     // Destination
   memloc,      // Index of Destination
   8);          // The first 8 bytes
memloc += 16;
于 2012-10-30T06:32:25.690 に答える
0

あなたが試すことができる2つの方法。System.Buffer.BlockCopy() を使用して直接コピーを行う最初の方法

例えば

// fill in the audience header
Buffer.BlockCopy(version, memloc, sendBuf, 0, 8);   // the first 8 bytes

もう 1 つの方法は、System.Text.Encoding 名前空間を使用して char[] からすべてのバイトを取得することです。

sendBuf = System.Text.Encoding.ASCII.GetBytes(version);
于 2012-10-30T05:56:00.423 に答える