Master255
@Master255

Как преобразовать cli::array ^ в byte *??

Помогите пожалуйста. Уже два дня голову ломаю как преобразовать.
Суть программы, как её понимаю я: необходимо прочитать кусок файла, размером 65536 байт.
И отправить в команду memmove языка С. Который делает простую вещь...передвигает байты.
И всё бы хорошо, но я пишу программу в visual c++ 2013 в которой присутствуют чудесные инструменты типа cli. Упрямо возникает ошибка не соответствия типов...вот код:

Это задаются переменные и начинается чтение файла. Чтение файла происходит правильно и хорошо, но чтение происходит в массив, а надо не в массив...смотрим следующий код...там понятно куда надо.
FileStream^ fs;
	try
	{
		fs = File::OpenRead(File);
	}
	catch (Exception^ ex)
.....
const int BUFFER_SIZE = 65536;
	char *szBuffer = new char[BUFFER_SIZE];
	unsigned char buf[BUFFER_SIZE];
	array<unsigned char>^ b = gcnew array<unsigned char>(BUFFER_SIZE);
	UTF8Encoding^ temp = gcnew UTF8Encoding(true);
	__int64 iPrevReaded = 0;
	__int64 Start = TimerInit();
	String^ g;
	int cbReaded = 0;


	// чтение из файла и вычисление TTH
	while ((cbReaded = fs->Read(b, 0, BUFFER_SIZE)) > 0)
	{
		g=temp->GetString(b);
		//cli::pin_ptr<System::Byte> p = g;
		tt_update(&ctx, b, cbReaded);


как видно это процедура обрабатывает поступающие из файла данные. И тип - переменная тут byte *buffer.
Текст ошибки:
" 2 IntelliSense: argument of type "cli::array ^" is incompatible with parameter of type "byte *" c:\Users\...\MyForm.cpp 112
"
void tt_update(TT_CONTEXT *ctx, byte *buffer, word32 len)
{

  if (ctx->index)
  { /* Try to fill partial block */
	  unsigned left = BLOCKSIZE - ctx->index;
	  if (len < left)
		{
		memmove(ctx->block + ctx->index, buffer, len);
		ctx->index += len;


Помогите пожалуйста...сил больше нету гуглить...
Вот что есть...stackoverflow.com/questions/25600940/managed-c-cli...
но так преобразуется только 1 первый байт...а надо 65535.
Вот проект https://github.com/master255/SimplyServer
  • Вопрос задан
  • 3213 просмотров
Решения вопроса 1
Используйте pin_ptr

array<Byte>^ bytes = File::ReadAllBytes( fileName );
pin_ptr<unsigned char> pptr = &bytes[0];
const int BUFFER_SIZE = 65536;
unsigned char buf [ BUFFER_SIZE ];
memcpy_s( buf, sizeof(buf), pptr, bytes->Length );
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Уж если наворотили C++, используйте std::move.

Вы пытаетесь отстрелить себе ногу.

Когда в одном коде активно применяют сборщик мусора, и пытаются влепить низкоуровневую функцию из C, потому что где-то слышали, что это быстро, при этом размер держат в целочисленной переменной, мне становится грустно.

Правильный учебник по написанию приложений TCP/IP называется "Эффективное использование TCP/IP" под авторством Й. Снейдера.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы