DELPHI代码如下:
procedure TForm1.Button8Click(Sender: TObject);
var
s:string;
i,j,start,len:integer;
buff:array[0..63] of byte;
begin
s:='';
start:=combobox7.ItemIndex or (combobox6.ItemIndex shl 8);//1、这句里的or是什么意思?
len:=strtoint(combobox8.Text);
buff[0]:=combobox5.itemindex; for i:=1 to 6 do begin
try
buff[i]:=strtoint('$'+copy(edit14.Text,i*2-1,2));//这一句转换进制,在C#里怎么写啊?edit14.Text="FFFFFFFFFFFF"
except
beep;
messagebox(handle,'数据错误!','提示信息',16);
edit14.SetFocus;
exit;
end;
end;
i:=readic(start,len,@buff[0]);//调用外部的DLL,详细看下面的调用说明
if i=0 then
for j:=0 to len-1 do
s:=s+inttohex(buff[j],2);//这一句C#怎写啊。
edit21.Text:=s;
SHOWMESSAGE('Result: '+inttostr(i));
end;
调用说明:
int ReadIC(unsigned int start, unsigned int len, unsigned char *str);//C#怎样声明外部DLL的这个函数啊。
参数:
start [in]:起始地址,指定数据写的位置。对于Mifare卡(Adel9200),起始地址由两字节组成:高字节为块号,低字节为区号。如0x0102表示读取2区1块。
Len [in]:要读取数据的长度。对于Mifare卡(Adel9200)长度为16的整数倍。
str [in,out]:无符字符指针,接收所读取的数据。对于Mifare卡(Adel9200)同时作为输入参数传入所读区的授权密码,由7个字节组成:第一个字节为授权码:若为0需核对A密码,若为1需核对B密码,后6个字节为密码。
procedure TForm1.Button8Click(Sender: TObject);
var
s:string;
i,j,start,len:integer;
buff:array[0..63] of byte;
begin
s:='';
start:=combobox7.ItemIndex or (combobox6.ItemIndex shl 8);//1、这句里的or是什么意思?
len:=strtoint(combobox8.Text);
buff[0]:=combobox5.itemindex; for i:=1 to 6 do begin
try
buff[i]:=strtoint('$'+copy(edit14.Text,i*2-1,2));//这一句转换进制,在C#里怎么写啊?edit14.Text="FFFFFFFFFFFF"
except
beep;
messagebox(handle,'数据错误!','提示信息',16);
edit14.SetFocus;
exit;
end;
end;
i:=readic(start,len,@buff[0]);//调用外部的DLL,详细看下面的调用说明
if i=0 then
for j:=0 to len-1 do
s:=s+inttohex(buff[j],2);//这一句C#怎写啊。
edit21.Text:=s;
SHOWMESSAGE('Result: '+inttostr(i));
end;
调用说明:
int ReadIC(unsigned int start, unsigned int len, unsigned char *str);//C#怎样声明外部DLL的这个函数啊。
参数:
start [in]:起始地址,指定数据写的位置。对于Mifare卡(Adel9200),起始地址由两字节组成:高字节为块号,低字节为区号。如0x0102表示读取2区1块。
Len [in]:要读取数据的长度。对于Mifare卡(Adel9200)长度为16的整数倍。
str [in,out]:无符字符指针,接收所读取的数据。对于Mifare卡(Adel9200)同时作为输入参数传入所读区的授权密码,由7个字节组成:第一个字节为授权码:若为0需核对A密码,若为1需核对B密码,后6个字节为密码。
那个外部调用函数,我倒是帮你弄一下,使用平台调用:[DllImport("xxxx.dll", CharSet = CharSet.Auto)]
public extern static int int ReadIC(uint start, uint len,ref byte str);
sdl2005lyx 帮帮我啊。
我写成下面这样,好象不行啊,麻烦帮我看看吧。引用:
[DllImport("MAINDLL.DLL", EntryPoint = "ReadIC", CharSet = CharSet.Ansi)]
public static extern int ReadIC(int start, int len, StringBuilder str);
调用:
int s1 = 0x0102;
int s2 =32;
StringBuilder s3 = new StringBuilder(64);
s3.Append("0x000xFF0xFF0xFF0xFF0xFF0xFF");
int i2 =ReadIC(s1, s2, s3);
public static extern int ReadIC(int start, int len, ref byte str);你看看delphi代码,明明使用的byte类型!
授权密码(FFFFFFFFFFFF),由7个字节组成:第一个字节为授权码:若为0需核对A密码,若为1需核对B密码,后6个字节为密码
i:=readic(start,len,@buff[0]);//调用外部的DLL,详细看下面的调用说明这里明显是一个byte字节啊。buff[i]:=strtoint('$'+copy(edit14.Text,i*2-1,2));//这一句转换进制,在C#里怎么写啊?edit14.Text="FFFFFFFFFFFF"这句代码说明这个strtoint成功把"FFFFFFFFFFFF"变成了一个字节的东西,对吧?
所以,现在关键问题,是如何在C#写出strtoint类似的函数!
try
buff[i]:=strtoint('$'+copy(edit14.Text,i*2-1,2));//这一句转换进制,在C#里怎么写啊?edit14.Text="FFFFFFFFFFFF"
except
beep;
改后:
int[] buff = new int[6];
String source = "FFFFFFFFFFFF"; //edit14.Text="FFFFFFFFFFFF"
for (int i = 1; i < 6;i++ )
{
buff[i] = Convert.ToInt32(source.Substring(i * 2 - 1, 2), 16);
}
combobox7.ItemIndex=1
combobox6.ItemIndex=2
start:=combobox7.ItemIndex or (combobox6.ItemIndex shl 8);关键是中间的“or”、“shl”完全看不懂了。
[DllImport("xxxx.dll")]
public extern static int ReadIC(int start, int len, byte[] str); void button8_Click(object sender, EventArgs e)
{
string s;
int i, j, start, len;
byte[] buff = new byte[64]; s = "";
start = comboBox7.SelectedIndex | (comboBox6.SelectedIndex << 8);
len = Convert.ToInt32(comboBox8.Text);
buff[0] = (byte)comboBox5.SelectedIndex; for (i = 1; i <= 6; i++)
{
try
{
buff[i] = Convert.ToByte(textBox1.Text.Substring(i * 2 - 2, 2), 16);
}
catch (Exception)
{
Microsoft.VisualBasic.Interaction.Beep(); // 项目中要添加 Microsoft.VisualBasic 引用
MessageBox.Show("数据错误!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Error);
textBox14.Focus();
return;
}
} i = ReadIC(start, len, buff);
if (i == 0)
{
for (j = 0; j <= len - 1; j++)
s = s + buff[j].ToString("X2");
}
textBox21.Text = s;
MessageBox.Show("Result: " + i);
}
public extern static int ReadIC(int start, int len, byte[] str);如果这个样子不行的话,就改为:
public extern static int ReadIC(int start, int len, IntPtr str);
要把数组转换成IntPtr,然后传入。下面的代码,是byte数组到指针的转换参考
public class Struct_Transform
{
//struct转换为byte[]
public static byte[] StructToBytes(object structObj)
{
int size = Marshal.SizeOf(structObj);
IntPtr buffer = Marshal.AllocHGlobal(size);
try
{
Marshal.StructureToPtr(structObj, buffer, false);
byte[] bytes = new byte[size];
Marshal.Copy(buffer, bytes, 0, size);
return bytes;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}