DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 4
在线用户: 2
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 zwzqq (小小) ★☆☆☆☆ -
普通会员
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));//未测试
----------------------------------------------
泱泱华夏十亿兵,国耻期待儿孙平,愿提十万虎狼旅,跃马扬刀灭东京!
作者:
男 sensorwu (老吴) ▲▲▲△△ -
普通会员
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级程序员
作者:
男 luckyso999 (luckyso) ★☆☆☆☆ -
盒子活跃会员
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做出的代码,没测试过
----------------------------------------------
-
作者:
男 zwzqq (小小) ★☆☆☆☆ -
普通会员
2022/12/16 18:09:47
5楼: 谢谢,各位大佬!
----------------------------------------------
-
作者:
男 zwzqq (小小) ★☆☆☆☆ -
普通会员
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.
}
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行80.07813毫秒 RSS