function str2binl(str)
{
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for (var i = 0; i < str.length * chrsz; i += chrsz)
    bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
  return bin;
}看 不懂,有懂的大虾说下

解决方案 »

  1.   

    貌似是这样function str2binl(str: string): string;
    var
      I: Integer;
      chrsz: Byte;
      mask: Byte;
    begin
      I := 0;
      chrsz := 8;
      SetLength(Result, Length(str) shr 5 + 1);
      while i < Length(str) * chrsz do
      begin
        Result[i shr 5 + 1] := Chr(Ord(Result[i shr 5 + 1])
          or ((Ord(str[i div chrsz + 1])) and mask) shl (i mod 32));
        Inc(I, chrsz);
      end;
    end;
      

  2.   

    刚才楼上的大虾给的试了一下,不管Str是什么,返回结果都是为空用JS的测试str2binl('123456'),返回的结果是:875770417,13877
      

  3.   

    本来这个是JS的MD5写法,但是,MD5了3次,我用delphi的MD5加了3次,但是2个结果不一样
    function md5(s)  //32的一次MD5
    {
      return binl2hex(core_md5(str2binl(s), s.length * chrsz));
    }function md5_3(s)   //3次MD5
    {
      var tmp = new Array;
      tmp = core_md5(str2binl(s), s.length * chrsz)
      tmp = core_md5(tmp, 16 * chrsz);
      tmp = core_md5(tmp, 16 * chrsz);
      return binl2hex(tmp);
    }
    一次MD5可直接用delphi里MD532位加密就可以
    但是MD53次,就不一样了.有没有办法实现直接跟md5_3(s),的3次MD5函数一样?
    md5_3('123456')返回的是D93AE65992CAF6A8751E334D0A716AD8
      

  4.   

    function str2binl(str: string): string;
    var
      I, ishr5: Integer;
      chrsz: Byte;
      mask: Byte;
      res: TStringList;
    begin
      I := 0;
      chrsz := 8;
      res := TStringList.Create;
      mask := (1 shl chrsz) - 1;
      while i < Length(str) * chrsz do
      begin
        ishr5 := i shr 5;
        if (ishr5 >= res.Count) then
        begin
          res.Add('');
        end;
        res[ishr5] :=
          Format('%d', [StrToIntDef(res[ishr5], 0)
            or (Ord(str[i div chrsz + 1]) and mask ) shl (i mod 32)]);
        Inc(I, chrsz);
      end;
      Result := res.CommaText;
      res.Free;
    end;