读书人

怎么处理DLL中char*类型参数的内容

发布时间: 2011-12-10 00:07:34 作者: rapoo

怎样处理DLL中char*类型参数的内容?
1.DLL原形:
int __stdcall _ReadCard(char *S);//读卡

2.
在DELPHI调用返回:
{182,193,191,168,202,167,176,220,161,163, 'E ', 'r ', 'r ', 'o ', 'r ', ': ', '- ', '2 ', '2 ',0}
显示:读卡失败。Error:-22

3.
在vs2005+C#调用:
[DllImport( "LsdSle4442.dll ", SetLastError = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern Int32 _ReadCard(byte[] S);

private void btnRead_Click(object sender, EventArgs e)
{
byte[] buf;
buf = new Byte[255];
int n = _ReadCard(buf);
string s = Encoding.ASCII.GetString(buf);

MessageBox.Show(s);
}
中buf返回:
{182,193,191,168,202,167,176,220,161,163,69,114,114,111,114,58,45,50,50,0,...}
显示:??????????Error:-22

问:既然得到了正确的数据,我怎样才能让它显示为:读卡失败。Error:-22


[解决办法]
using System.Text;
using System.Windows.Forms;

class Program
{
static void Main()
{
byte[] buf = {182,193,191,168,202,167,176,220,161,163,69,114,114,111,114,58,45,50,50,0,};
string s = Encoding.GetEncoding( "GB2312 ").GetString(buf);
MessageBox.Show(s);
}
}

// 显示:读卡失败。Error:-22

[解决办法]
string s = Encoding.GetEncoding( "GB2312 ").GetString(buf);

这一句换成

string s = Encoding.Default.GetString(buf);
用系统默认的字符集来解码,不要固定为GB2312,这样以后如果要移植在非中文的系统上减少麻烦。

读书人网 >C#

热点推荐