2012-10-30 8 views
5

Jestem programistą C++ i ostatnio zacząłem pracować nad WPF. Używam Array.Copy() w mojej aplikacji i wygląda na to, że nie jestem w stanie uzyskać pożądanego rezultatu.Nie można użyć Array.Copy() w mojej aplikacji WPF

zrobiłem w moim C++ aplikacja następująco:

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 

Zrobiłem podobną operację w moim WPF (C#) aplikacji w następujący sposób:

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; 

Ale to wyrzuca mi błąd przy Array.Copy(sendBuf + memloc, version, 8); jako Operator '+' cannot be applied to operands of type 'byte[]' and 'int'.

Jak można to osiągnąć? :) proszę o pomoc :)

+1

Zgadza się. C# nie ma szalonych niejawnych konwersji tablicy-> wskaźnika, aby zmylić wszystkich. – chris

+0

@chris: Jak możemy go osiągnąć, kolego? :) Dowolny alternatywny sposób? –

+1

Nie byłbym osobą, która mogłaby zapytać. Nie mam jeszcze doświadczenia z C#, ale uwielbiam sposób, w jaki radzi sobie z niektórymi z tych, które uważam za wady C/C++. – chris

Odpowiedz

2
for(int i = 0; i < 8; i++) 
{ 
    sendBuf[i+memloc] = Convert.ToSByte(version[i]); 
} 
+0

Dzięki za odpowiedź. To nie wydaje się działać. Zarówno 'sendBuf' i' version' są puste. –

+0

Och, czy próbujesz skopiować wersję do sendBuf? Jeśli tak, oba powinny być odwrócone (jak również liczby całkowite). Może również wymagać, aby tablice były tego samego typu. Nie jestem pewien, czy spróbuje i po prostu rzucić wartości, czy nie – Brandon

+1

Wyjątek Typemismatch jest zgłaszany. Ponieważ wersja to char, a sendbuf to bajt. –

0

Dwa sposoby na wypróbowanie. Pierwszy sposób można zrobić prostą kopię używając System.Buffer.BlockCopy()

np

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

Innym sposobem jest po prostu wszystkie bajty z char [] za pomocą System.Text .Kodowanie przestrzeni nazw.

sendBuf = System.Text.Encoding.ASCII.GetBytes(version); 
1

Przetłumaczyłem to dla ciebie. Wyjaśnienia są wbudowane.

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; 
+0

@llianPinzon: Zgłasza wyjątek po Array.Copy jako' Typ tablicy źródłowej nie może być przypisany do docelowego typu tablicy. ' –

+0

Działa dla mnie. Sprawdź, jak deklarujesz swoją tablicę "wersji". Powinien to być bajt []. To samo co sendBuf. Spójrz, jak to zgłosiłem. –

+0

@llian Pinzon: Cóż, działa dobrze :) Ale moim następnym krokiem jest wykonanie tej samej operacji z tablicą łańcuchów. 'var myDBoards = nowy [] { "", "S1010013" "S1010014" "S1010015" "S1010017" };' i podobne działanie musi być wykonane z tego. 'memcpy (sendBuf + memloc, myDBoards [temp], 8);' where temp = 2 ie "S1010014" Jak mogę to osiągnąć? :) –

Powiązane problemy