谁可以帮我把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个字节为密码。
...全文
203 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
请高手指教!
NET程序员的开发利器.NET Reflector 一、 简介   程序集,作为.NET时代的动态链接库,蕴藏了太多的软件秘密。为此,Visual Studio内置的ILDASM成为最初挖掘程序集的上佳工具。但自从Reflector出现后,ILDASM相形见拙。因为,Reflector能提供更多的程序集信息,而且是免费的工具。   如今,在Visual Studio.NET中编译源代码(无论是VB还是C#)时,编译器都会将高级源代码翻译成MSIL,即“微软中间语言”,而不是特定的机器指令。具有更多安全性、版本控制、共享能力与其它相关元数据的中间语言(IL),是包在一个或多个DLL或可执行文件中的。   基于ILDASM检查程序集中的IL有时很有用,但它要求我们熟悉MSIL。通常,比起IL,大多数开发人员对像C#或Visual Basic这样的高级程序设计语言更为熟悉。   Reflector的出现使.NET程序员眼前豁然开朗,因为这个免费工具可以将.NET程序集中的中间语言反编译成C#或者Visual Basic代码。除了能将IL转换为C#或Visual Basic以外,Reflector还能够提供程序集中类及其成员的概要信息、提供查看程序集中IL的能力以及提供对第三方插件的支持。   二、 下载与运行Reflector   Reflector是由微软员工Lutz Roeder编写的免费程序。这个软件经常更新,你可以在http://www.aisto.com/roeder/dotnet下载最新的版本。在本文成文之时,Reflector的最新版本为5.0.35.0,仅有1M大小。只要双击下载后的Reflector.exe文件即可运行Reflector。   默认情况下,Reflector会打开一组公共程序集(mscorlib、System、System.Data、System.Drawing等等)。每个打开的程序集都列在Reflector的主窗口中。单击程序集旁边的+图标可以展开树结构并展示程序集的命名空间。每个命名空间旁边都有一个相关的+图标,单击这个图标将显示这个命名空间内的类。除此以外,还可以展开每个类,显示类的成员:事件、字段、方法与属性。   要想查看其它程序集(包括我们自己创建的程序集)的细节,你可以使用菜单命令“File→Open”。然后,浏览到想要查看的程序集。只要选择了有效的.NET程序集,这个程序集就可以在Reflector的主窗口中与其它默认程序集共同显示。要想从Reflector的主窗口中删除程序集,只需右击程序集并选择“Close”。   三、 使用Reflector反汇编程序集   提供基本的程序集是Reflector唾手可得的功能,然而,Reflector真正的威力体现在它的反汇编能力。只要浏览到类级的成员,就可以通过Tools菜单中的Disassembler项(或在该项上单击右键)反汇编此成员。这将打开第二个窗格,以C#、Visual Basic、Delphi或者IL显示反汇编后的内容。图2以C#语言展示了对SmtpClient类中Abort方法的反汇编结果。   有了Reflector的反编译功能,要研究.NET框架基类库就容易多了。我们完全可以在没有源代码的情况下研究我们所创建或者正在使用的程序集相应源代码。   不用太担心,你自己的.NET应用程序还有其它受保护措施。但是,想阻止别人查看.NET程序集的IL(继而反编译成C#或者Visual Basic)是不可能的,但你可以使用“混淆”技术使IL变得混乱。目前,市场上有许多.NET混淆产品,比如:PreEmptive Solution的Dotfuscator、WiseOwl的Dmeanor以及Remotesoft的.NET Obfuscator等。   四、 Reflecator的其它功能   除了作为对象浏览器与反汇编器之外,Reflector还可以显示类与其成员的调用与被调用图、提供单键访问Google或MSDN搜索的能力并提供了允许第三方开发人员为Reflector创建插件的框架。   要查看调用或被调用图,只需要在树视图中选择一个成员,访问Tools菜单,选择Call Graph或Callee Graph选项即可。Call Graph会列出所选项所调用的成员,而Callee Graph列出调用所选项的成员。   通过使用插件,Reflector的功能可以得到进一步扩展。目前有能显示程序集依赖图、自动加载当前运行中的程序集、输出整个程序集的反汇编内容以及在Visual Studio中作为Reflector的宿主等的插件。还有更多插件都列在http://www.codeplex.com/reflectoraddins中。在此,我极力推荐有兴趣的读者前去一看。   不出乎所料,的确存在一个Reflector.VisualStudio插件。有了这个插件,就可以让Reflector集成在Visual Studio环境中,进而取代以前那个有些“拙漏”的对象浏览器。   首先,我们需要在机器上准备Reflector的最新版,然后从http://www.testdriven.NET/reflector下载最新版本的Reflector.VisualStudio插件。据说安装了此插件之后,Reflector能够与Visual Studio完美融合。但遗憾的是,本人试下载此软件并安装(仅能得到TestDriven.NET-2.8.2130 RTM个人测试版本,时间7/30/2007,大小3.3M)后,没有大发现—仅是在VS2005中添加“Go to Reflector”和一个助菜单项。点击“Go to Reflector”菜单项仅是从VS2005内部启动Reflector而已。   有了Reflector.VisualStudio插件(正版,下面是根据在线资料介绍),Reflector可以寄在Visual Studio中Reflector不仅是一个对象浏览器、反汇编器,包裹在同一个程序中的所有功能还可以寄于Visual Studio中。   五、 小结   还记得Spy++吗?在Win32时代,这个软件对于我们分析一个陌生软件的设计思路可谓立下汗马功劳。在如今的.NET时代,Reflector又成为每个严肃的.NET开发人员工具箱中必不可少的精髓工具之一。怎么样,请赶紧试锋吧。

111,094

社区成员

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

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

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