DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: forget66
今日帖子: 64
在线用户: 9
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/12/29 17:48:06
标题:
小弟我从FastReport的fqbUtils.pas中, 复制了一段Base64加密的函数. 但是: Android不支持数据类型: AnsiString,PAnsiChar,AnsiChar 浏览:2046
加入我的收藏
楼主: 小弟我从FastReport的fqbUtils.pas中, 复制了一段Base64加密的函数.

想在xe10.3中, 目标平台选择Android时, 无法通过XE编绎检查.

因为FMX下, Android不支持数据类型: AnsiString,PAnsiChar,AnsiChar

请问大侠,我该如何改下列代码(主要是上述三个数据类型),才能和原先一样的加密效果?


function fqbBase64Decode(const S: AnsiString): AnsiString;
  var
    F, L, M, P: Integer;
    B, OutPos: Byte;
    OutB: Array[1..3] of Byte;
    Lookup: Array[AnsiChar] of Byte;
    R: PAnsiChar;
const
  Base64Charset = AnsiString('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/');
begin
  L := Length(S);
  P := 0;
  while (L - P > 0) and (S[L - P] = '=') do Inc(P);
  M := L - P;
  if M <> 0 then
  begin
    SetLength(Result, (M * 3) div 4);
    FillChar(Lookup, Sizeof(Lookup), #0);
    for F := 0 to 63 do
      Lookup[Base64Charset[F + 1]] := F;
    R := Pointer(Result);
    OutPos := 0;
    for F := 1 to L - P do
    begin
      B := Lookup[S[F]];
      case OutPos of
          0 : OutB[1] := B shl 2;
          1 : begin
          OutB[1] := OutB[1] or (B shr 4);
          R^ := AnsiChar(OutB[1]);
          Inc(R);
          OutB[2] := (B shl 4) and $FF
          end;
          2 : begin
          OutB[2] := OutB[2] or (B shr 2);
          R^ := AnsiChar(OutB[2]);
          Inc(R);
          OutB[3] := (B shl 6) and $FF
          end;
          3 : begin
          OutB[3] := OutB[3] or B;
          R^ := AnsiChar(OutB[3]);
          Inc(R)
          end
        end;
      OutPos := (OutPos + 1) mod 4
    end;
    if (OutPos > 0) and (P = 0) then
      if OutB[OutPos] <> 0 then
        Result := Result + AnsiChar(OutB[OutPos])
  end else
    Result := ''
end;
----------------------------------------------
...
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
2019/12/29 19:41:59
1楼: 按此在新窗口浏览图片  indy or 自带?
----------------------------------------------
[alias]  co = clone --recurse-submodules  up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/>http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
男 lsuper (lsuper) ★☆☆☆☆ -
盒子活跃会员
2019/12/30 0:09:06
2楼: use System.NetEncoding  TNetEncoding.Base64....
----------------------------------------------
-
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2019/12/30 8:40:01
3楼: 干嘛非得要那一段?
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/12/30 10:20:59
4楼: 之所以要用fastreport中这一段, 是因为有一些数据, 采用这种方式保存.

如果改变算法. 原有数据可能要重新升级一下....

因此, 如果能找回原先的的代码的对应手机版, 就可以省云升级烦脑.
----------------------------------------------
...
作者:
男 thinknet (thinknet) ★☆☆☆☆ -
盒子活跃会员
2019/12/30 13:21:16
5楼: Base64就一标准算法,系统自带的应该也一样编码解码,除非Fastreport中是非标的
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2019/12/30 16:11:18
6楼: 楼主总有理。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/12/30 21:51:12
7楼: Fastreport好像是非标的.

@wang_80919, 没,我只是想尝试一下.

最终, 我还是改用System.NetEncoding的方法. ( 跟着大部队走, 放心)
----------------------------------------------
...
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/12/30 21:58:15
8楼:   Memo1.Lines.Text:=fqbBase64Encode('今天AABBCC你写程序了吗?');
输出结果:
vfHM7EFBQkJDQ8Tj0LSzzNDywcvC8D8=


  Memo2.Lines.Text:=TNetEncoding.Base64.Encode('今天AABBCC你写程序了吗?');
输出结果:
5LuK5aSpQUFCQkND5L2g5YaZ56iL5bqP5LqG5ZCXPw==

win32编绎,fastreport确实是非标.
----------------------------------------------
...
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2019/12/31 9:05:28
9楼: fastreport 的 fqbBase64Decode 是使用 ANSI 编码,而标准的是使用UTF8编码,
这样就可以了:

Memo2.Lines.Text:=TNetEncoding.Base64.EncodeBytesToString(TEncoding.ANSI.GetBytes('今天AABBCC你写程序了吗?'));

输出结果:
vfHM7EFBQkJDQ8Tj0LSzzNDywcvC8D8=
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
作者:
男 aknightchen (.) ★☆☆☆☆ -
盒子活跃会员
2019/12/31 14:47:46
10楼: @全能兄:

实在太感谢你了!!!!
你这个,就是我要达到的效果.
(按你上述转编码后, FastReport与TNetEncoding.Base64是一模一样了)

关于编码问题,我一直一知半解, 基本都是懑的. 感谢你第二次在编码上指导我!!!

也感谢其它各位朋友的参与!
----------------------------------------------
...
作者:
男 earthsbest (全能中间件) ▲▲▲▲△ -
普通会员
2020/1/7 9:16:25
11楼: @楼主,帮助别人进步是提升自己最可靠的方式。
有时候,有些问题,看起来大概思路都懂得,但是真要实现起来也会遇到一些小麻烦,当我仔细研究把问题解决了,我也得到更好的复习与锻炼。
----------------------------------------------
Delphi4Linux Delphi三层/FireDAC 技术群:734515869 http://www.cnblogs.com/rtcmw
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行93.75毫秒 RSS