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;

解决方案 »

  1.   

    帮你顶
    Delphi的东西都不记得了
      

  2.   

    这个代码转换逻辑没错.
    这应该是Delphi和C#在两个32位的数据相乘时,超过int的最大值,然后编译器自动进行转换处理后得到的结果,所以C#会得到负值.因为C#在两个32位的数据相乘时,超过int的最大值,会将得到的64位数据中的高32位数据直接截取掉,只保留低32位数据,而32位数据的最高位是符号位,所以就会有负数出现了.只是不知Delphi在处理超过int的最大值时的默认的处理方式是什么?因为之前没有使用过,你研究下它是怎么转的的,在C#中对应处理就可以了.