2012-05-15 3 views
-3

Если я не правильно, следующие коды используются для копирования массива байтов в позиции памяти в C#:Скопировать количество байтов в положение, в памяти

byte[] byteName = Encoding.ASCII.GetBytes("Hello There"); 

int positionMemory = getPosition(); 

Marshal.Copy(byteName, 0, new IntPtr(positionMemory), byteName.length); 

Как я могу добиться этого в родной C++?

Заранее спасибо.

+2

strcpy/strncpy. Это очень простые функции, которые расскажет вам любая книга C. – Pubby

+0

@Pubby Я не программист на C, C++. Я программист на C#. Мне нужно преобразовать код в C# для проекта C++. спасибо за указание на это. – olidev

+2

Я проигнорировал главным образом, потому что я получаю «memcpy» как первый результат при поиске в Google * «C++ copy bytes» *. Вы также должны проверить 'std :: copy', что является более общим назначением. Во всяком случае, удачи. – Pubby

ответ

6

использовать указатель и тетсру:

void * memcpy (void * destination, const void * source, size_t num); 

Предположим, вы хотите скопировать массив A длины п в массиве B

memcpy (B, A, n * sizeof(char)); 

Это больше C, чем C++, класс строки имеют которые вы можете использовать.

size_t length; 
    char buffer[20]; 
    string str ("Test string..."); 
    length=str.copy(buffer,6,5); 
    buffer[length]='\0'; 

Вот более конкретный пример с полным кодом:

#include <stdio.h> 
#include <string> 
#include <string.h> 
#include <iostream> 

using namespace std; 
int main() 
{ 

    string s("Hello World"); 
    char buffer [255]; 
    void * p = buffer; // Or void * p = getPosition() 
    memcpy(p,s.c_str(),s.length()+1); 
    cout << s << endl; 
    cout << buffer << endl; 
    return 0; 
} 

дайте мне знать, если вам нужно больше информации

+0

Кажется, он хочет скопировать строковый литерал '" Hello There "' в место, возвращаемое 'getPosition()'. Можете ли вы показать это более четко в своих образцах? –

+1

Как вы уже указывали, копирование блоков памяти в случайную позицию не является действительно безопасным. Не хотел туда ехать, но так как вы спросили: p –

1

memcpy(), memmove(), CopyMemory() и MoveMemory() могут быть использованы в качестве родного equivilents Marshal.Copy(). Что касается обработки позиции, все .NET-код выполняет как отличное от целого числа указателя, которое вы также можете делать на C++. Выведенный код .NET эквивалентен следующему:

std::string byteName = "Hello There"; 
int positionMemory = getPosition(); 
memcpy(reinterpret_cast<void*>(positionMemory), byteName.c_str(), byteName.length());