gpt4 book ai didi

c# - 使用 C# 为 PInvoke 字符串编码指定代码页

转载 作者:行者123 更新时间:2023-11-30 16:35:16 25 4
gpt4 key购买 nike

我正在使用 PInvoke 调用 DLL。 DLL 的函数返回代码页 437 中的 C 字符串。

有没有办法让 .Net 编码(marshal)处理将字符串转换为 unicode,或者有人可以建议我应该将哪些参数提供给 DllImport() 和 MarshalAs() 以及要使用的转换函数以获得 unicode 输出?

作为引用,这是我目前使用的 DllImport:

[DllImport("name.dll", CharSet=CharSet.Unicode) ]
internal static extern int GetSweepParam(
int param_num,
[Out,MarshalAs(UnmanagedType.LPStr)]StringBuilder param_name,
[Out,MarshalAs(UnmanagedType.LPStr)]StringBuilder param_units,
double[] values,
[MarshalAs(UnmanagedType.LPStr)]StringBuilder error_string
);

最佳答案

ANSI 字符串编码始终使用系统默认编码。如果您想使用其他编码,则可以自己编码这些字符串。

[DllImport("name.dll")]
internal static extern int GetSweepParam(
int param_num,
[Out]byte[] param_name,
[Out]byte[] param_units,
double[] values,
byte[] error_string
);

static void Test()
{
Encoding enc = Encoding.GetEncoding(437);
byte[] param_name = new byte[1000], param_units = new byte[1000];
GetSweepParam(123, param_name, param_units, new double[0], enc.GetBytes("input only"));
string name = enc.GetString(param_name, 0, Array.IndexOf(param_name, (byte)0));
string units = enc.GetString(param_units, 0, Array.IndexOf(param_units, (byte)0));
}

如果字符串是由非托管函数分配的,那么您可以从 IntPtr 中对其进行编码。

static unsafe string PtrToStringAnsiWithEncoding(IntPtr p)
{
int l = 0;
byte* bytes = (byte*)p.ToPointer();
while(bytes[l] != 0) l++;
char* chars = stackalloc char[l];
int bytesUsed, charsUsed;
bool completed;
Encoding.GetEncoding(437).GetDecoder().Convert(bytes, l, chars, l, true, out bytesUsed, out charsUsed, out completed);
return new string(chars, 0, charsUsed);
}

关于c# - 使用 C# 为 PInvoke 字符串编码指定代码页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1975813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com