谁能翻译一下

ROE0901 2012-03-02 02:37:31
两段代码分别是什么意思详细解释


for i := 0 to 20-1 do begin
strNew := strNew + IntToHex(buffer[(i)*2],2)+inttohex(buffer[(i)*2+1],2);
end;



bb := TMemoryStream.Create;
bb.Write(strnew,1024);
bb.Free;
strNew := DeCardNumber(strNew) + '20';//??
str := '';
for i := 1 to Length(strNew) do begin
if i mod 2 = 0 then begin
str := str + chr( StrToInt('$'+strNew[i-1]+strNew[i]));
if str[length(str)]=':' then str[length(str)]:='9';
end;
end;
...全文
222 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
ROE0901 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 funxu 的回复:]
给你3点提示
1 首先你自己要知道在c#中把字符串和字节数组进行互换,具体参看Encoding类,或者问度娘,然后根据数组中的数值检查delphi dll返回的字节字符串是否正确

2 转换的方法其实你的例子中已经给了,就是将byte数组每2个一组按照前后颠倒的顺序保存,然后将byte数组转换成字符串显示出来,同理参看encoding类

3 最后由于对方传入的是16进制字符串,而uni……
[/Quote]

1的前半段会。。但是后半段怎么判断字节字符串是否正确?
23能理解就是不知道顺序是不是也是 先将读出来的字节 进行十六进制转换然后再将字节前后颠倒?还有就是判断中英文貌似不行吧。。这个要怎么判断 我还没转换呢?
funxu 2012-03-02
  • 打赏
  • 举报
回复
其实中英文混排也是可以实现的,就是需要判断读入的字符是否是中文的一半,否则顺序转换,是则再读如一位颠倒存储再转换,话说了这么多,基本思路都给了,剩下的就是纯代码了
funxu 2012-03-02
  • 打赏
  • 举报
回复
更正,第二点只有中文才需要前后颠倒,普通字符不需要,顺序存储即可
funxu 2012-03-02
  • 打赏
  • 举报
回复
给你3点提示
1 首先你自己要知道在c#中把字符串和字节数组进行互换,具体参看Encoding类,或者问度娘,然后根据数组中的数值检查delphi dll返回的字节字符串是否正确

2 转换的方法其实你的例子中已经给了,就是将byte数组每2个一组按照前后颠倒的顺序保存,然后将byte数组转换成字符串显示出来,同理参看encoding类

3 最后由于对方传入的是16进制字符串,而unicode和ansi在处理中英文时会有差异,所以要先和对方约定,返回至中不应出现中英文混排
ROE0901 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 funxu 的回复:]
delphi dll如果传递的是pchar,c#里用string或stringbuilder接收即可
这和16进没任何关系,如何把16进字符串转unicode请问度娘

抱歉这问题我有心理阴影
当年我做delphi提供一个dll给客户的C#"高级工程师"调用
对方先说我写的dll有问题无法调用,让我被领导训了半小时,无奈之余我用C#写了个loadlibrary的例子发过去
2天后对方说……
[/Quote]

你是怎么转换的。。诚恳的请求助。。我这也是 直接读出来时一顿不认识的啥字。。我都不知道怎么转换
ROE0901 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 funxu 的回复:]
delphi dll如果传递的是pchar,c#里用string或stringbuilder接收即可
这和16进没任何关系,如何把16进字符串转unicode请问度娘

抱歉这问题我有心理阴影
当年我做delphi提供一个dll给客户的C#"高级工程师"调用
对方先说我写的dll有问题无法调用,让我被领导训了半小时,无奈之余我用C#写了个loadlibrary的例子发过去
2天后对方说……
[/Quote]

这么冲动
funxu 2012-03-02
  • 打赏
  • 举报
回复
更正是dllimport
funxu 2012-03-02
  • 打赏
  • 举报
回复
delphi dll如果传递的是pchar,c#里用string或stringbuilder接收即可
这和16进没任何关系,如何把16进字符串转unicode请问度娘

抱歉这问题我有心理阴影
当年我做delphi提供一个dll给客户的C#"高级工程师"调用
对方先说我写的dll有问题无法调用,让我被领导训了半小时,无奈之余我用C#写了个loadlibrary的例子发过去
2天后对方说我写的dll有bug,读出的字符串是乱码,于是我又用C#写了一个调用加转换的例子发过去
于是这件事情的结尾就是C#的高级工程师没有任何过错,而我写的dll即不符合标准dll规范,又不符合标准字符串
我只能说,规范你妹,以后遇到此类问题我一概不解答


ROE0901 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 funxu 的回复:]
C#是unicode字符集,delphi早期版本是ansi字符集,对于字符的转换一个是双字节,一个是单字节,而且那个buffer的操作在delphi里表示字节,在C#里表示字符明白了?
简单些
"你好吗"delphi里length=6,C#里length=3,字符串读出来是要做unicode转换的,我没有qq,因为单位安全级别高,虾米都不能装
[/Quote]

c#如何接收缓冲区里出来的数据。。而且还是十六进制的。。。。
funxu 2012-03-02
  • 打赏
  • 举报
回复
C#是unicode字符集,delphi早期版本是ansi字符集,对于字符的转换一个是双字节,一个是单字节,而且那个buffer的操作在delphi里表示字节,在C#里表示字符明白了?
简单些
"你好吗"delphi里length=6,C#里length=3,字符串读出来是要做unicode转换的,我没有qq,因为单位安全级别高,虾米都不能装
ROE0901 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 funxu 的回复:]
引用 11 楼 roe0901 的回复:
我c#的。。嘿嘿 只能大概看懂。。。这块有用

我想劝Lz一句,我也正在C#,上面的代码都是非常基础的操作,即便有些函数不理解但是看名字delphi和C#都是通用的,例如c#里也有对字符串str[1]的操作,同样字符串也有length方法,抛掉这些,除了inttohex,和那个"$"基本没剩什么了,再退一步,调试一下不会死人的
[/Quote]

其实看得懂就是怕有错误啊。。还有就是 我用c#按着他这种写法去读取东西会有乱码。你不正好也用c#那我问问你吧
我这有个读卡机它提供了一个借口打开 ——读取 ——关闭。。。我们delphi能无误的读出数据。但我们这是用asp做的。需要c#做一个以供调用。打开关闭都没问题,问题在今天给你看的这个代码这。有个读取数据的地方他放到了数据缓冲区里。。我不会所以看下delphi的做法
给你看下动态链接库的方法


[DllImport("fzyktclient.dll",CharSet=CharSet.None)]
public extern static int ykt_readopencard4442_local(int offset, int length, ref byte pData, StringBuilder pWarnmsg, StringBuilder pErrmsg);

pdata文档说是16进制并且在缓冲区里。他肯定已经提取出来了。。因此我就生命了byte去接外部该如何实现 你有qq???这样说话好累
funxu 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 roe0901 的回复:]
我c#的。。嘿嘿 只能大概看懂。。。这块有用
[/Quote]
我想劝Lz一句,我也正在C#,上面的代码都是非常基础的操作,即便有些函数不理解但是看名字delphi和C#都是通用的,例如c#里也有对字符串str[1]的操作,同样字符串也有length方法,抛掉这些,除了inttohex,和那个"$"基本没剩什么了,再退一步,调试一下不会死人的
ROE0901 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 case5166 的回复:]
str[length(str)]:='9';
数组赋值LZ有没见过?
[/Quote]

我c#的。。嘿嘿 只能大概看懂。。。这块有用
kaikai_kk 2012-03-02
  • 打赏
  • 举报
回复
判断最后一位,若是冒号,就改成9

为什么这样做,就不清楚了
我看见佛 2012-03-02
  • 打赏
  • 举报
回复
str[length(str)]:='9';
数组赋值LZ有没见过?
ROE0901 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 funxu 的回复:]
strNew := strNew + IntToHex(buffer[(i)*2],2)+inttohex(buffer[(i)*2+1],2);
意思就是i=0的时候
转换的是buffer[0],buffer[1]
i=1转换的是buffer[2],buffer[3]
[/Quote]


if str[length(str)]=':' then str[length(str)]:='9';
这个是做什么如果等于:就给它赋值9???
funxu 2012-03-02
  • 打赏
  • 举报
回复
strNew := strNew + IntToHex(buffer[(i)*2],2)+inttohex(buffer[(i)*2+1],2);
意思就是i=0的时候
转换的是buffer[0],buffer[1]
i=1转换的是buffer[2],buffer[3]

ROE0901 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 funxu 的回复:]
第一段是个字符串拼接,循环20次
拼接的内容是buffer这块内存对应位置转换成16进的字符串,附带每2字节转换一次

第二段前三句是把拼接的字符串写入一个内存流里,但是那个流立即释放了,也没保存在任何地方,不知道作者怎么想的

DeCardNumber不知道这个函数干嘛的

后面是循环字符串,把字符串里每两个字符转换成数字然后取该数字ascii码对应的字符,然后再拼起来
[/Quote]

附带每2字节转换一次

这个什么意思
我看见佛 2012-03-02
  • 打赏
  • 举报
回复
strNew := DeCardNumber(strNew) + '20';//我也是刚看到这个,不知道是什么,应该是自定义的函数吧
bb := TMemoryStream.Create;
bb.Write(strnew,1024);
bb.Free;
这个代码还真没有什么意义哦

funxu 2012-03-02
  • 打赏
  • 举报
回复
第一段是个字符串拼接,循环20次
拼接的内容是buffer这块内存对应位置转换成16进的字符串,附带每2字节转换一次

第二段前三句是把拼接的字符串写入一个内存流里,但是那个流立即释放了,也没保存在任何地方,不知道作者怎么想的

DeCardNumber不知道这个函数干嘛的

后面是循环字符串,把字符串里每两个字符转换成数字然后取该数字ascii码对应的字符,然后再拼起来
加载更多回复(3)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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