C# 中IntPtr 与 string,数组互转

2024-06-11 20:58

本文主要是介绍C# 中IntPtr 与 string,数组互转,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、IntPtr 与 string互转

string str = "aa";

IntPtr init = Marshal.StringToHGlobalAnsi(str);

string ss= Marshal.PtrToStringAnsi(init);

//最后释放掉

Marshal.FreeHGlobal(init);  

二、char*与string互转

 string a = "11";      

 char* aChar = (char*)System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(a).ToPointer(); 

string result = Marshal.PtrToStringAnsi((IntPtr)aChar);   

三、char* 与 IntPtr互转

可以直接强制类型转换

IntPtr init = (IntPtr)aChar;

char* aChar = (char*)init;

 

在c++里数据转指针是很容易的,但是在托管代码里,转起来就比较费劲了。转换方法如下:
  • 1

internal static IntPtr ArrayToIntptr(byte[] source)
{
if (source == null)
return IntPtr.Zero;
unsafe
{
fixed (byte* point = source)
{
IntPtr ptr = new IntPtr(point);
return ptr;
}
}
}
internal static IntPtr ArrayToIntptr(byte[] source)
{
if (source == null)
return IntPtr.Zero;
byte[] da = source;
IntPtr ptr = Marshal.AllocHGlobal(da.Length);
Marshal.Copy(da, 0, ptr, da.Length);
return ptr;
}
如果不安全代码要用在.net里,只是在项目属性里,设置一下就行,但是要在unity里用的话就必须要加点东西了。
在unity里使用不安全代码时,要在Assetm目录下建一个smcs.rsp文件,在里边写一句-unsafe就行了,这个文件就是一个文本文件,然后改一下后缀名就行。

将数组转换为IntPtr

 
  1. //第一种,使用不安全的代码块来访问直接指向字节数组的指针。

  2. static IntPtr ArrayToIntptr(byte[] source)

  3. {

  4. if (source == null)

  5. {

  6. return IntPtr.Zero;

  7. }

  8.  
  9. unsafe

  10. {

  11. fixed (byte* point = source)

  12. {

  13. IntPtr ptr = new IntPtr(point);

  14. return ptr;

  15. }

  16. }

  17. }

  18.  
  19.  
  20. //第二种,可以使用 GCHandle 来获得对象。

  21. GCHandle

  22. using System.Runtime.InteropServices;

  23.  
  24. byte[] test = new byte[5];

  25. GCHandle hObject = GCHandle.Alloc(test, GCHandleType.Pinned);

  26. IntPtr pObject = hObject.AddrOfPinnedObject();

  27.  
  28. if(hObject.IsAllocated)

  29. {

  30. hObject.Free();

  31. }

  32.  
  33.  
  34. //第三种, 通过 LocalAlloc 创建内存块并将数据封送处理到该内存块。

  35. LocalAlloc

  36. [DllImport("coredll.dll",SetLastError=true)]

  37. public static extern IntPtr LocalAlloc(uint uFlags, uint uBytes);

  38. [DllImport("coredll.dll",SetLastError=true)]

  39. public static extern IntPtr LocalFree(IntPtr hMem);

  40. [DllImport("coredll.dll",SetLastError=true)]

  41. public static extern IntPtr LocalReAlloc(IntPtr hMem, uint uBytes, uint fuFlags);

  42.  
  43. public const uint LMEM_FIXED = 0;

  44. public const uint LMEM_MOVEABLE = 2;

  45. public const uint LMEM_ZEROINIT = 0x0040;

  46.  
  47. byte[] test = new byte[5];

  48. IntPtr p = LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, (uint)test.Length);

  49.  
  50. if (p == IntPtr.Zero)

  51. {

  52. throw new OutOfMemoryException();

  53. }

  54. else

  55. {

  56. Marshal.Copy(test, 0, p, test.Length);

  57. }

 

这篇关于C# 中IntPtr 与 string,数组互转的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052263

相关文章

C# 中变量未赋值能用吗,各种类型的初始值是什么

对于一个局部变量,如果未赋值,是不能使用的 对于属性,未赋值,也能使用有系统默认值,默认值如下: 对于 int 类型,默认值是 0;对于 int? 类型,默认值是 null;对于 bool 类型,默认值是 false;对于 bool? 类型,默认值是 null;对于 string 类型,默认值是 null;对于 string? 类型,哈哈,没有这种写法,会出错;对于 DateTime 类型,默

C#中,decimal类型使用

在Microsoft SQL Server中numeric类型,在C#中使用的时候,需要用decimal类型与其对应,不能使用int等类型。 SQL:numeric C#:decimal

剑指offer(C++)--数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution {public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {int len = data.size();if(len<2)return;int one = 0;for(int i

IOS 数组去重的几种方式

本来只知道NSSet和KeyValues的。今天又新学了几种方式 还有就是和同事学的一种方式 外层循环从0开始遍历,内层从最后一个元素开始遍历 for(int i=0;i<index;i++){  for(int j=index-1;j>i;j-- ){ } }

算法与数据结构面试宝典——回溯算法详解(C#,C++)

文章目录 1. 回溯算法的定义及应用场景2. 回溯算法的基本思想3. 递推关系式与回溯算法的建立4. 状态转移方法5. 边界条件与结束条件6. 算法的具体实现过程7. 回溯算法在C#,C++中的实际应用案例C#示例C++示例 8. 总结回溯算法的主要特点与应用价值 回溯算法是一种通过尝试各种可能的组合来找到所有解的算法。这种算法通常用于解决组合问题,如排列、组合、棋盘游

C# 命名管道中客户端访问服务器时,出现“对路径的访问被拒绝”

先还原一下我出现错误的情景:我用C#控制台写了一个命名管道服务器,然后用ASP.NET写了一个客户端访问服务器,运行之后出现了下面的错误: 原因:服务器端的访问权限不够,所以是服务器端的问题,需要增加访问权限。(网上很多都说是文件夹的权限不够,情况不同,不适用于我这种情况) 解决办法: (1)在服务器端相应地方添加以下代码。 PipeSecurity pse = new PipeSec

1_CString char* string之间的关系

CString转char*,string string转char*,CString char* 转CString,string 一、CString转char*,string //字串转换测试 CString CString1; std::string string1; CHAR* char1=NULL; //1string1=CString1.GetBuffer();CStri

如何通过示例将旧版 C# 转换为 C# 12

随着 C# 的不断发展,每个新版本都会引入强大的新功能,从而提高语言的功能和可读性。通过从旧版本的 C# 迁移到 C# 12,您可以获得更高效、更易于维护和更具表现力的代码。 由于代码库遗留、公司限制以及对旧语言功能的熟悉,许多开发人员仍在使用旧版本的 C#。升级似乎很困难,但现代版本的 C# 具有显著的优势,例如更好的性能、增强的功能和更高的安全性。 通过增量重构、试点项目和团队培训逐步

Java基础(二)——数组,方法,方法重载

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 + TS + Pinia + Element Plus + Spring全家桶 + MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步至千里,积小流成江海 🥇推荐学习:🍖开源 rich-vue3 🍍前端面试

C# 日志框架Serilog使用

1、框架和说明        C#日志框架Serilog支持多种场景输出,简单验证了一下,比较方便        包的安装,推荐直接使用“推荐NuGet包管理器”安装Serilog.AspNetCore,常见的组件都已经集成在一个包中,使用比较方便 2、配置文件        Serilog可以由配置文件来定义行为,而且配置文件的修改即时生效。参考配置文件如下: {"Serilog":