高手帮忙看看Delphi代码转C#代码问题

veryec 2010-03-16 07:30:43
Delphi代码如下:
function Tfsoftsn.getcode(name:string):string;
var str,s0,s1:string;
i,j,u,n,k,m:integer;
begin
s0:='V9WXYZAIN5G6QC4LM1RBPEFG23JH7ST8UKBA';
m:=length(trim(name));
s1:='';
k:=0;
for u:=1 to 4 do
begin
for j:=1 to 5 do
begin
for i:=1 to m do
begin
k:=k+ord(name[i])*i*(i+1)*j*(j+3)*(j+5)*u*(u+7)*(u+9)*(u+11);
end;
s1:=s1+copy(s0,(k mod 37),1);
end;
if u<>4 then
s1:=s1+'-';
end;
result:=s1;
end;

C#代码如下:

string name = "北厦A1中港";
int m = 0;
int k = 0;
string s1 = "";
string s0 = "V9WXYZAIN5G6QC4LM1RBPEFG23JH7ST8UKBA";

m = (name.Trim()).Length;
char[] word = name.ToCharArray();

for (int u = 1; u <= 4; u++)
{
for (int j = 1; j <= 5; j++)
{
for (int i = 1; i <= m; i++)
{

int f = (int)word[i - 1];
int c=i * (i + 1) * j * (j + 3) * (j + 5) * u * (u + 7) * (u + 9) * (u + 11);
k = k + f * c;
}

int start = k % 37; //int start = Math.Abs(k % 37);//有时候总取到负值?
s1 = s1 + s0.Substring(start, 1);//负值索引问题!
}
if (u != 4)
{
s1 = s1 + "-";
}
}

return s1;

...全文
80 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
veryec 2010-03-29
  • 打赏
  • 举报
回复
不好意思,还没找到解决办法,有没高手指点一二,谢谢,分不够继续追加。
xingyuebuyu 2010-03-18
  • 打赏
  • 举报
回复
这个代码转换逻辑没错.
这应该是Delphi和C#在两个32位的数据相乘时,超过int的最大值,然后编译器自动进行转换处理后得到的结果,所以C#会得到负值.

因为C#在两个32位的数据相乘时,超过int的最大值,会将得到的64位数据中的高32位数据直接截取掉,只保留低32位数据,而32位数据的最高位是符号位,所以就会有负数出现了.

只是不知Delphi在处理超过int的最大值时的默认的处理方式是什么?因为之前没有使用过,你研究下它是怎么转的的,在C#中对应处理就可以了.
缭绕飘渺 2010-03-18
  • 打赏
  • 举报
回复
帮你顶
Delphi的东西都不记得了
veryec 2010-03-17
  • 打赏
  • 举报
回复
咋没人呢,自己顶一下。

110,533

社区成员

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

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

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