kidneyball 大侠 上一个问题的代码 可以改成字定义循环位置的吗? 比如加一个定位循环位置的函数,可以从指定的组 开始循环
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
cmbSource: TComboBox; //在Form上放个ComboBox作为输入
memResult: TMemo; //在Form上放个Memo作为输出
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject); //在Form上放个按钮触发运算
private
{ Private declarations }
public
{ Public declarations }
end;
const
MaxGroup = 2; //最大组数
CharMap : array[1..MaxGroup, 1..2] of string[16] = //改变MaxGroup时需要同时改变转换表定义
(('FE98BA54761032DC', '89EFCD23016745AB'),
('543210FEDCBA9876', 'DCBA9876543210FE')
);
var
Form1: TForm1;
CharMappingTable : array[1..MaxGroup, 1..2, 48..122] of char;
implementation
{$R *.dfm}
procedure MakeTable; //建立映射表,只需在开始运行一次,转换期间不用运行
var i, j, k : integer;
begin
for i := 1 to MaxGroup do
for j := 1 to 2 do
for k := 1 to 16 do
begin
if (k<=6) then
begin
CharMappingTable[i,j,byte('a')-1+k] := CharMap[i,j,k];
CharMappingTable[i,j,byte('A')-1+k] := CharMap[i,j,k];
end
else CharMappingTable[i,j,k-7+byte('0')] := CharMap[i,j,k]
end;
end;
procedure Convert(var s : string); //为了照顾效率, 采用直接写变量参数的的做法. 最后结果在传入的参数中
var i, k : integer;
begin
//MakeTable; //建立映射表
//因已在Form.OnCreate建立了映射表, 这里不用重复建立
i := 1; //字符指针
k := 1; //当前用的转换表组号
while i <= length(s) do
begin
s := CharMappingTable[k, 1 , Byte(s)];
inc(i); //指向第二个字符, 若s符合格式, 必定不会出界
s := CharMappingTable[k, 2, Byte(s)];
inc(i,2); //跳过空格, 到下一组第一个字符
if k < MaxGroup then inc(k) else k:=1;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var s : string;
begin
//转换
s := self.cmbSource.Text;
Convert(s);
self.memResult.Text := s;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MakeTable; //建立全局映射表
//初始化调试数据
self.cmbSource.Items.Add('62 C7 2C A2 92 0E DC 85 98 EE 63 C6 2D A3 93 0F DD 84 99 EF 60 C5 2E A0 90 0C DE 87 9A EC 61 C4 2F A1 91');
self.cmbSource.ItemIndex := 0;
end;
end.