array^ 转化成char*问题

aaa2742 2017-04-25 09:19:17
想把array<char>^数据拷贝到char t[]里面,
void ManClass::SendData(array<char>^ sendBuff,unsigned char len)
{
//***手动循环复制,比较笨的方法
char* t = (char*)malloc(sizeof(char)*len);
for (int i= 0;i<len;i++)
{
t[i] = sendBuff[0];
}

p_Unman->SendData(t,len);


}
除了循环复制为有其他省事的办法吗?
使用Marshal.Copy好像也不行,
请问有别的方式吗?
...全文
1211 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
stherix 2017-04-25
  • 打赏
  • 举报
回复
#pragma unmanaged

#include<stdio.h>
#include<stdlib.h>

void print(unsigned char* t)
{
    printf((char *)t);
}

#pragma managed

using namespace System;
using namespace System::Runtime::InteropServices;

int main()
{
    array<unsigned char>^ sendBuff = gcnew array<unsigned char>(5);
    sendBuff[0]=65;   
    sendBuff[1]=66;
    sendBuff[2]=67;
    sendBuff[3]=68;
    sendBuff[4]=0;
    unsigned char* t = (unsigned char*)malloc(sizeof(unsigned char)*5);
    IntPtr ptr(t);
    Marshal::Copy(sendBuff,0,ptr,5);
    print(t);
    Console::ReadKey();
}
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
引用 3 楼 Saleayas 的回复:
CopyMemory 给你一个样例,复制到 std::vector 的。
__inline static std::vector< BYTE > Assign(array< System::Byte > ^ar)
{
	if (ar != nullptr && ar->Length > 0)
	{
		std::vector<BYTE> vt(ar->Length);
		pin_ptr<BYTE> ptr = &ar[0];
		CopyMemory(&vt[0], ptr, vt.size() * sizeof (vt[0]));
		return std::move(vt);
	}
	else
	{
		return std::vector< BYTE >();
	}
}
复制到char*里面怎么搞?
Saleayas 2017-04-25
  • 打赏
  • 举报
回复
CopyMemory 给你一个样例,复制到 std::vector 的。
__inline static std::vector< BYTE > Assign(array< System::Byte > ^ar)
{
	if (ar != nullptr && ar->Length > 0)
	{
		std::vector<BYTE> vt(ar->Length);
		pin_ptr<BYTE> ptr = &ar[0];
		CopyMemory(&vt[0], ptr, vt.size() * sizeof (vt[0]));
		return std::move(vt);
	}
	else
	{
		return std::vector< BYTE >();
	}
}
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
循环也不费事 而且Marshal.Copy应该是可以的啊 无论是托管数组还是非托管数组,在内存中都是连续的
我试着不行,您可以试试,也许我用的不对
stherix 2017-04-25
  • 打赏
  • 举报
回复
循环也不费事 而且Marshal.Copy应该是可以的啊 无论是托管数组还是非托管数组,在内存中都是连续的
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
多谢各位,看来我某些地方用起来不太变通呀,向你们学习。
stherix 2017-04-25
  • 打赏
  • 举报
回复
引用 8 楼 aaa2742 的回复:
你试试这样行吗 array<char>^ test = gcnew array<char>(5); test[0] = 1; test[1] = 2; test[2] = 3; test[3] = 4; test[4] = 5; char* p = (char*)malloc(sizeof(char)*5); IntPtr Pptr(p); Marshal::Copy(test,0,Pptr,5);
Marshal.Copy不支持signed char 估计是因为源码里c#只有byte,而byte是无符号,没有对sbyte重载这个方法了
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
你试试这样行吗 array<char>^ test = gcnew array<char>(5); test[0] = 1; test[1] = 2; test[2] = 3; test[3] = 4; test[4] = 5; char* p = (char*)malloc(sizeof(char)*5); IntPtr Pptr(p); Marshal::Copy(test,0,Pptr,5);
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
引用 6 楼 aaa2742 的回复:
[quote=引用 5 楼 stherix 的回复:]
#pragma unmanaged

#include<stdio.h>
#include<stdlib.h>

void print(unsigned char* t)
{
    printf((char *)t);
}

#pragma managed

using namespace System;
using namespace System::Runtime::InteropServices;

int main()
{
    array<unsigned char>^ sendBuff = gcnew array<unsigned char>(5);
    sendBuff[0]=65;   
    sendBuff[1]=66;
    sendBuff[2]=67;
    sendBuff[3]=68;
    sendBuff[4]=0;
    unsigned char* t = (unsigned char*)malloc(sizeof(unsigned char)*5);
    IntPtr ptr(t);
    Marshal::Copy(sendBuff,0,ptr,5);
    print(t);
    Console::ReadKey();
}
我这个提示报错 错误 1 error C2665: “System::Runtime::InteropServices::Marshal::Copy”: 16 个重载中没有一个可以转换所有参数类型 F:\temp\MyUsb\MyUsb\MyUsb.cpp 145 1 MyUsb [/quote] 我知道了,我用的libusb,发送的数据一直是char型,换成unsigned char型就能复制了
aaa2742 2017-04-25
  • 打赏
  • 举报
回复
引用 5 楼 stherix 的回复:
#pragma unmanaged

#include<stdio.h>
#include<stdlib.h>

void print(unsigned char* t)
{
    printf((char *)t);
}

#pragma managed

using namespace System;
using namespace System::Runtime::InteropServices;

int main()
{
    array<unsigned char>^ sendBuff = gcnew array<unsigned char>(5);
    sendBuff[0]=65;   
    sendBuff[1]=66;
    sendBuff[2]=67;
    sendBuff[3]=68;
    sendBuff[4]=0;
    unsigned char* t = (unsigned char*)malloc(sizeof(unsigned char)*5);
    IntPtr ptr(t);
    Marshal::Copy(sendBuff,0,ptr,5);
    print(t);
    Console::ReadKey();
}
我这个提示报错 错误 1 error C2665: “System::Runtime::InteropServices::Marshal::Copy”: 16 个重载中没有一个可以转换所有参数类型 F:\temp\MyUsb\MyUsb\MyUsb.cpp 145 1 MyUsb

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧