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个字节为密码。

解决方案 »

  1.   

    这个不难吧,你能看明白deiphi代码的意思,再会点简单的c#语法就行话说c#调用外部dll可以先引用方式加进项目,再using一下,即可使用里面的方法、函数。
      

  2.   

    楼主,Pascal语法都不熟悉了,大学学的都换个老师了!如果没人帮你,建议自己查查pascal的资料。
    那个外部调用函数,我倒是帮你弄一下,使用平台调用:[DllImport("xxxx.dll", CharSet = CharSet.Auto)]
    public extern static int int ReadIC(uint start, uint  len,ref byte str);
      

  3.   


    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);
      

  4.   

    类型对应错误,我不是都给你写了啊:unsigned char  ===》 byte[DllImport("MAINDLL.DLL", EntryPoint = "ReadIC", CharSet = CharSet.Ansi)]
    public static extern int ReadIC(int start, int len, ref byte str);你看看delphi代码,明明使用的byte类型!
      

  5.   

    用 Byte 参数,下面这些字节怎传进去?
    授权密码(FFFFFFFFFFFF),由7个字节组成:第一个字节为授权码:若为0需核对A密码,若为1需核对B密码,后6个字节为密码
      

  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类似的函数!
      

  7.   

    楼主,我帮你把这段改成C#的了 for i:=1 to 6 do begin
      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); 
                }
      

  8.   

    谢谢!请问这一句怎样转换??
    combobox7.ItemIndex=1
    combobox6.ItemIndex=2 
    start:=combobox7.ItemIndex or (combobox6.ItemIndex shl 8);关键是中间的“or”、“shl”完全看不懂了。
      

  9.   


    [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);
    }
      

  10.   

    14楼的这个比较靠谱。
    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);
                }
            }