问题是这样的:
var
f:file of string[8];
s1:string;
s2:string;
i:integer;
j:integer;
s8:string[8];
begin
AssignFile(f,'asd.pgm');
s:='9999999999999';//13个9
s8:=function(s);
//需要大家帮忙写这个函数
Rewrite(f);
Write(f,s8);
Closefile(f);
{
//最后得到的文件的内容如下:
9f 86 01 00 ff e0 f5 05
以上是文件内容
下边是分别对应13个9转化成16进制位置
5 6 7 8 1 2 3 4
其实后4位也就是9 9 9 9 9 9 9 9转化为16进制后倒置后排列的 //8个9
前4位是99999转化为16进制后倒置后排列的 //5个9』}end;
var
f:file of string[8];
s1:string;
s2:string;
i:integer;
j:integer;
s8:string[8];
begin
AssignFile(f,'asd.pgm');
s:='9999999999999';//13个9
s8:=function(s);
//需要大家帮忙写这个函数
Rewrite(f);
Write(f,s8);
Closefile(f);
{
//最后得到的文件的内容如下:
9f 86 01 00 ff e0 f5 05
以上是文件内容
下边是分别对应13个9转化成16进制位置
5 6 7 8 1 2 3 4
其实后4位也就是9 9 9 9 9 9 9 9转化为16进制后倒置后排列的 //8个9
前4位是99999转化为16进制后倒置后排列的 //5个9』}end;
function IntToHex(Value: Integer; Digits: Integer): string; overload;
function IntToHex(Value: Int64; Digits: Integer): string; overload;
对数字进行十六进制转换
var s:string;
aa:myrec;
f:file of byte;
begin
s:='9999999999999';
aa.a1:=StrToint(copy(s,1,5));
aa.b1:=StrToint(copy(s,6,9));
assignfile(f,'c:\test.dat');
rewrite(f);
blockwrite(f,aa,sizeof(aa));
closefile(f);
end;
const
s1='99999999';
s2='99999';
var
n:Integer;
begin
SetLength(Result,8);
n:=StrToInt(s2);
StrLCopy(PChar(Result),@n,4);
n:=StrToInt(s1);
StrLCat(PChar(Result),@n,8);
end;
s1, a1, s2, a2, T1, T2: string;
i, j: integer;
begin
Result := TStringList.Create;
s1 := IntToHex(StrToInt(Copy(Value, 1, 5)), 8);
s2 := IntToHex(StrToInt(Copy(Value, 6, 8)), 8);
SetLength(a1, 8);
SetLength(a2, 8);
for i := 1 to 4 do
begin
T1 := Copy(s1, i * 2 - 1, 2);
T2 := Copy(s2, i * 2 - 1, 2); for j := 1 to 2 do
begin
a1[8-(i*2-j)] := T1[j];
a2[8-(i*2-j)] := T2[j];
end;
end;
Result.Add(a1+a2);
Result.Add('5 6 7 8 1 2 3 4');
end;返回结果:
9F860100FFE0F505
5 6 7 8 1 2 3 4测试及使用方法:
procedure TForm1.Button1Click(Sender: TObject);
var
List:TStringList;
s:string;
begin
s:='9999999999999';
List:=G(s);
Memo1.Lines.Assign(List);
List.Free;end;
的ascii给显示出来了我用chr试验一下在说
hiflower(花)老兄的结果倒是很接近
const
s1='99999999';
s2='99999';
var
n:Integer;
begin
SetLength(Result,8);
n:=StrToInt(s2);
StrLCopy(PChar(Result),@n,4);
n:=StrToInt(s1);
StrLCat(PChar(Result),@n,8);
end;
我们的要求是不定长字符串的例如我给的是 s:='123';
sui
而不是转化后的16进制
type
myrec=record
a1,b1:integer;
end;
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
aa:myrec;
f:file of byte;
begin
s:='9999999999999';
aa.a1:=StrToint(copy(s,1,5));
aa.b1:=StrToint(copy(s,6,9));
assignfile(f,'c:\test.dat');
rewrite(f);
blockwrite(f,aa,sizeof(aa));
closefile(f);
end;
完全满足'9999999999999'->
9f 86 01 00 ff e0 f5 05
var
s1,s2:string;
n:Integer;
begin
// s1='99999999';
// s2='99999';
s:=Trim(s);
if Length(s)>13 then raise Exception.Create('Too Large!');
s1:=RightStr(s,8);
n:=Length(s)-8;
if n<0 then
s2:='0'
else
s2:=Copy(s,1,n);
SetLength(Result,8);
n:=StrToInt(s2);
Move(n,Result[1],4); //原来的 StrLCopy 和 StrLCat 不可靠,改用 Move
n:=StrToInt(s1);
Move(n,Result[5],4);
end;procedure TForm1.Button1Click(Sender: TObject);
var
s:string[8];
begin
s:=ToS8(edit1.Text);
caption:=s; //此处设断点
end;观察 s 的值:
输入 '9999999999999' '123'
ord(s[0]) $8 $8 //$8,这是字符串的长度
ord(s[1]) $9F $00
ord(s[2]) $86 $00
ord(s[3]) $01 $00
ord(s[4]) $00 $00
ord(s[5]) $FF $7B
ord(s[6]) $E0 $00
ord(s[7]) $F5 $00
ord(s[8]) $05 $00
小弟是青岛的
希望有机会可以感谢几位老兄,有空请大家吃海鲜!
呵呵!
hiflower(花)
zjqyb(风清扬*任它溺水三千,我只取一瓢饮*) 你们三个真行.
我每次都来晚了...