|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2022/12/15 14:13:23 |
标题: |
求助关于JS代码转Delphi代码的问题 |
浏览:817 |
|
加入我的收藏 |
楼主: |
JS代码: function toBase641(input) { var digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var base64_rep = ""; var cnt = 0; var bit_arr = 0; var bit_num = 0; for (var n = 0; n < input.length; ++n) { if (input[n] >= 'A' && input[n] <= 'Z') { ascv = input.charCodeAt(n) - 55; } else if (input[n] >= 'a' && input[n] <= 'z') { ascv = input.charCodeAt(n) - 87; } else { ascv = input.charCodeAt(n) - 48; } bit_arr = (bit_arr << 4) | ascv; bit_num += 4; if (bit_num >= 6) { bit_num -= 6; base64_rep += digits[bit_arr >>> bit_num]; bit_arr &= ~(-1 << bit_num); } } if (bit_num > 0) { bit_arr <<= 6 - bit_num; base64_rep += digits[bit_arr]; } var padding = base64_rep.length % 4; if (padding > 0) { for (var n = 0; n < 4 - padding; ++n) { base64_rep += "="; } } return base64_rep; }
Delphi代码: function TForm1.toBase64(input:String):String; const digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var base64_rep:String; cnt:Integer; n:Integer; ascv:Integer; bit_arr:Integer; bit_num:Integer; padding:Integer; begin ascv:=0; bit_arr:=0; bit_num:=0; for n := 1 to Length(input) do begin if input[n] in ['A'..'Z'] then ascv := Ord(input[n]) - 55 else if input[n] in ['a'..'z'] then ascv := Ord(input[n]) - 87 else ascv:= Ord(input[n]) - 48; bit_arr := (bit_arr shl 4) or ascv; memo1.Lines.Add(IntToStr(bit_arr)); bit_num := bit_num + 4; if bit_num >= 6 then begin bit_num := bit_num - 6; base64_rep := base64_rep + digits[bit_arr shr bit_num];//执行报错 bit_arr := bit_arr xor (-1 shl bit_num);//有问题 end; end; if bit_num > 0 then begin bit_arr := bit_arr shl (6 - bit_num); base64_rep := base64_rep+digits[bit_arr];//?有问题 end;
padding := Length(base64_rep) Mod 4; if padding > 0 then begin for n := 0 to 4 - padding - 1 do begin base64_rep := base64_rep + '='; end; end; Result := base64_rep; end;
Delphi代码运行出错,不知道问题出在哪里了?
----------------------------------------------
- |
作者: |
lsuper (lsuper) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2022/12/15 15:53:39 |
1楼: |
直接对应算法?
uses Soap.EncdDecd 然后 EncodeString;如果内容中文可能要 utf8 再 EncodeBase64
----------------------------------------------
-
|
作者: |
dorry (littlecat) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2022/12/16 9:19:49 |
2楼: |
bit_arr := bit_arr xor (-1 shl bit_num);//有问题 这个转换有问题吧! 试试这个 bit_arr :=( bit_arr and not (-1 shl bit_num));//未测试
----------------------------------------------
泱泱华夏十亿兵,国耻期待儿孙平,愿提十万虎狼旅,跃马扬刀灭东京!
|
作者: |
|
2022/12/16 12:12:59 |
3楼: |
不明白Base64编码Delphi本身有提供函数,为啥要翻译JS的函数?
uses System.NetEncoding;
begin Base64Str := TNetEncoding.Base64.Encode(inputStr); end;
具体Base64原字符串采用什么编码,需要根据自己的实际情况,系统默认的是UniCode。
另外需要注意的是:使用TNetEncoding.Base64.Encode编码后的字符串,每隔76个字符会增加一个回车换行(#13#10),这样如果和其他语言对接,特别是使用类似MD5签名,就会因为多了回车换行,导致签名不一样。而肉眼看很难看出回车换行!!! Base64Str := Base64Str.Replace(#13#10,''); //去掉回车换行。
详细参见:https://blog.csdn.net/sensor_WU/article/details/128247971?spm=1001.2014.3001.5502
----------------------------------------------
喜欢编程的一个DOS级程序员
|
作者: |
|
2022/12/16 14:51:52 |
4楼: |
function toBase641(input: string): string; var digits: string; base64Rep: string; cnt: integer; bitArr: integer; bitNum: integer; n: integer; ascv: integer; begin digits := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; base64Rep := ''; cnt := 0; bitArr := 0; bitNum := 0; for n := 0 to length(input) - 1 do begin if input[n + 1] >= 'A' then if input[n + 1] <= 'Z' then ascv := ord(input[n + 1]) - 55 else if input[n + 1] >= 'a' then if input[n + 1] <= 'z' then ascv := ord(input[n + 1]) - 87 else ascv := ord(input[n + 1]) - 48 else ascv := ord(input[n + 1]) - 48; bitArr := (bitArr shl 4) or ascv; Inc(bitNum, 4); if bitNum >= 6 then begin bitNum := bitNum - 6; base64Rep := base64Rep + digits[bitArr shr bitNum]; bitArr := bitArr and not(-1 shl bitNum); end; end; if bitNum > 0 then begin bitArr := bitArr shl 6 - bitNum; base64Rep := base64Rep + digits[bitArr]; end; cnt := length(base64Rep) mod 4; if cnt > 0 then begin for n := 0 to 4 - cnt - 1 do base64Rep := base64Rep + '='; end; Result := base64Rep; end;
上面是用OpenAi做出的代码,没测试过
----------------------------------------------
-
|
作者: |
|
2022/12/16 18:09:47 |
5楼: |
谢谢,各位大佬!
----------------------------------------------
-
|
作者: |
|
2022/12/16 23:16:26 |
6楼: |
@luckyso999 (luckyso)OpenAi翻译得不错,基本上能看明白,麻烦再帮忙用OpenAi翻译一呢,谢谢!!
function base64ToHex ( txt, sep = '' ) { let { val, out } = base64ToHex, v1, v2, v3, v4, result = []; if ( ! base64ToHex.val ) { // Populate lookup tables. out = base64ToHex.out = []; val = base64ToHex.val = Array( 255 ).fill( 0 ); const keys = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; for ( let i = 0 ; i < 256 ; i++ ) out.push( ( '0' + i.toString(16) ).slice( -2 ) ); for ( let i = 0 ; i < 65 ; i++ ) val[ keys.charCodeAt( i ) ] = i; } for ( let i = 0, len = txt.length ; i < len ; i += 4 ) { v1 = val[ txt.charCodeAt( i ) ]; // Map four chars to values. v2 = val[ txt.charCodeAt( i+1 ) ]; v3 = val[ txt.charCodeAt( i+2 ) ]; v4 = val[ txt.charCodeAt( i+3 ) ]; result.push( out[ (v1 << 2) | (v2 >> 4) ], // Split values, map to output. out[ ((v2 & 15) << 4) | (v3 >> 2) ], out[ ((v3 & 3) << 6) | v4 ] ); } if ( v4 === 64 ) result.splice( v3 === 64 ? -2 : -1 ); return result.join( sep ); // Array is fast. String append = lots of copying. }
----------------------------------------------
-
|
|