谁可以帮我把DELPHI代码,传换成C#的啊。谢谢

qiuzhijun 2011-09-14 12:51:09
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个字节为密码。
...全文
188 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gemini Dean 2011-09-19
  • 打赏
  • 举报
回复
帮顶一下
mjp1234airen4385 2011-09-19
  • 打赏
  • 举报
回复
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);
}
}


jshi123 2011-09-19
  • 打赏
  • 举报
回复

[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);
}
qiuzhijun 2011-09-19
  • 打赏
  • 举报
回复


[Quote=引用 12 楼 nnnnyyyy 的回复:]

楼主,我帮你把这段改成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……
[/Quote]


谢谢!请问这一句怎样转换??
combobox7.ItemIndex=1
combobox6.ItemIndex=2
start:=combobox7.ItemIndex or (combobox6.ItemIndex shl 8);

关键是中间的“or”、“shl”完全看不懂了。
nnnnyyyy 2011-09-15
  • 打赏
  • 举报
回复
楼主,我帮你把这段改成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);
}

sdl2005lyx 2011-09-14
  • 打赏
  • 举报
回复
楼主,Pascal语法都不熟悉了,大学学的都换个老师了!如果没人帮你,建议自己查查pascal的资料。
那个外部调用函数,我倒是帮你弄一下,使用平台调用:

[DllImport("xxxx.dll", CharSet = CharSet.Auto)]
public extern static int int ReadIC(uint start, uint len,ref byte str);
freemangood 2011-09-14
  • 打赏
  • 举报
回复
这个不难吧,你能看明白deiphi代码的意思,再会点简单的c#语法就行

话说c#调用外部dll可以先引用方式加进项目,再using一下,即可使用里面的方法、函数。
阿建像熊猫 2011-09-14
  • 打赏
  • 举报
回复
重构吧。
sdl2005lyx 2011-09-14
  • 打赏
  • 举报
回复
楼主,你仔细看看原来的代码:
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类似的函数!
qiuzhijun 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 sdl2005lyx 的回复:]

类型对应错误,我不是都给你写了啊:

unsigned char ===》 byte

[DllImport("MAINDLL.DLL", EntryPoint = "ReadIC", CharSet = CharSet.Ansi)]
public static extern int ReadIC(int start, int len, ref byte str);

你看看de……
[/Quote]


用 Byte 参数,下面这些字节怎传进去?


授权密码(FFFFFFFFFFFF),由7个字节组成:第一个字节为授权码:若为0需核对A密码,若为1需核对B密码,后6个字节为密码
sdl2005lyx 2011-09-14
  • 打赏
  • 举报
回复
类型对应错误,我不是都给你写了啊:

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类型!
qiuzhijun 2011-09-14
  • 打赏
  • 举报
回复
急急。求救啊。
qiuzhijun 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sdl2005lyx 的回复:]

楼主,Pascal语法都不熟悉了,大学学的都换个老师了!如果没人帮你,建议自己查查pascal的资料。
那个外部调用函数,我倒是帮你弄一下,使用平台调用:

[DllImport("xxxx.dll", CharSet = CharSet.Auto)]
public extern static int int ReadIC(uint start, uint len,ref byte s……
[/Quote]

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);
ycproc 2011-09-14
  • 打赏
  • 举报
回复
建议看看书了还是自己转化吧
其实也没什么难度 就是一些语法上面的变化
qiuzhijun 2011-09-14
  • 打赏
  • 举报
回复
如果会的麻烦帮我处理一下吧,有少许报酬。
QQ: admin@pb2.cn
邮箱:admin@pb2.cn
qiuzhijun 2011-09-14
  • 打赏
  • 举报
回复
请高手指教!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧