【C#】解析char型指针所指向的内容

C#解析char型指针的内存块

1、背景

在c++代码中定义了一个功能函数,这个功能函数会将计算的结果写入一个字符串型的数组中output,然后c#会调用c++导出的dll中的接口函数,然后获取这个output并解析成string类型。

2、实例

c++:

cpp 复制代码
CPPDLL_API int Function( char*& output)

c#:

csharp 复制代码
[DllImport(@"Project1.dll", EntryPoint = "Function",CharSet = CharSet.Auto)]
public static extern int Function(ref IntPtr output);

IntPtr ptr = IntPtr.Zero;
int isok = Function(ref ptr);

// -> Unicode
byte[] bytes = System.Text.Encoding.Unicode.GetBytes(Marshal.PtrToStringUni(ptr));
// -> UTF8
string dec = System.Text.Encoding.UTF8.GetString(bytes);

错误代码:

csharp 复制代码
string dec = Marshal.PtrToStringAnsi(ptr);

得到的dec是乱码,查询发现是因为内存编码是UTF8,Marshal不支持UTF转换,所以必须先转成Unicode再转成UTF8。

相关推荐
阿蒙Amon6 小时前
C#每日面试题-Thread.Sleep和Task.Delay的区别
java·数据库·c#
cfqq19897 小时前
Settings,变量保存
开发语言·c#
云草桑8 小时前
.net AI开发04 第八章 引入RAG知识库与文档管理核心能力及事件总线
数据库·人工智能·microsoft·c#·asp.net·.net·rag
曹牧10 小时前
C#:窗体构造函数无法引用窗体控件
开发语言·c#
iAkuya10 小时前
(leetcode)力扣100 54实现Trie树
算法·leetcode·c#
xb113210 小时前
C#使用Cancellation来取消异步任务
开发语言·c#
m0_7482299910 小时前
C与C#:编程语言的核心差异解析
c语言·开发语言·c#
m0_7482299911 小时前
Laravel7.x核心特性全解析
c语言·数据库·c#
阿蒙Amon11 小时前
C#每日面试题-Task和Thread的区别
java·面试·c#
ytttr87313 小时前
C#实现海康威视智能车牌识别
开发语言·c#