using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace GeoSigmaDrawLib
{
///
/// 表示一个按指定编码转换后的非托管内存文本缓冲区。
/// 支持自动释放,避免内存泄漏。
///
public class NativeTextBuffer : IDisposable
{
private const string GB2312 = "GB2312";
///
/// 编码类型枚举,便于调用方选择
///
public enum EncodingType
{
GBK,
UTF8,
UTF16,
}
///
/// 非托管内存指针
///
public IntPtr Pointer { get; private set; }
///
/// 缓冲区字节长度
///
public int Length { get; private set; }
///
/// 构造函数:根据指定编码将字符串转换为非托管内存缓冲区
///
/// 源文本
/// 目标编码
public NativeTextBuffer(string text, EncodingType encoding = EncodingType.GBK)
{
if (text == null)
{
throw new ArgumentNullException(nameof(text));
}
Encoding enc = Encoding.GetEncoding(GB2312);
switch (encoding)
{
case EncodingType.GBK:
enc = Encoding.GetEncoding(GB2312);
break;
case EncodingType.UTF8:
enc = Encoding.UTF8;
break;
case EncodingType.UTF16:
enc = Encoding.Unicode;
break;
}
byte[] bytes = enc.GetBytes(text);
Pointer = Marshal.AllocHGlobal(bytes.Length);
Marshal.Copy(bytes, 0, Pointer, bytes.Length);
Length = bytes.Length;
}
///
/// 释放非托管内存
///
public void Dispose()
{
if (Pointer != IntPtr.Zero)
{
Marshal.FreeHGlobal(Pointer);
Pointer = IntPtr.Zero;
}
}
}
}