我想将一个十进制字符串(范围在0到26亿之间)转换为Delphi脚本化的基于Pascal的程序EZGPIB中的十六进制字符串。我似乎在互联网上找到了一段合适的代码,但却无法在EZGPIB中正确实现它。也许精通Pascal的人可以帮助我让它发挥作用? EZGPIB可在谷歌上使用,无需安装即可使用。下面是代码:
program hex_conv;
var
gwar:string;
function Hex(v: Longint; w: Integer): String;
var
s : String;
i : Integer;
hexc : array [0 .. 15] of Char;
begin
hexc[0] := '0';
hexc[1] := '1';
hexc[2] := '2';
hexc[3] := '3';
hexc[4] := '4';
hexc[5] := '5';
hexc[6] := '6';
hexc[7] := '7';
hexc[8] := '8';
hexc[9] := '9';
hexc[10] := 'A';
hexc[11] := 'B';
hexc[12] := 'C';
hexc[13] := 'D';
hexc[14] := 'E';
hexc[15] := 'F';
s[0] := Chr(w);
for i := w downto 1 do begin
s[i] := hexc[v and $F];
v := v shr 4
end;
Result := s;
end;
begin
EZGPIB_ScreenClear;
gwar:=hex(15,1);
EZGPIB_ScreenWriteLn(gwar);
gwar:=hex(1,1);
EZGPIB_ScreenWriteLn(gwar);
end.
如果我尝试编译它,EZGPIB编译器会抛出一个RuntimeError:超出字符串范围" s [0]:= Chr(w);"如果我拿走s - >周围的方括号; " s:= Chr(w);",然后代码编译并用于" gwar:= hex(15,1);"的最大输入。
答案 0 :(得分:1)
这是一个相当老式的实现,它使用有关现代Pascal不再有效的字符串内部工作方式的知识。 s [0]引用'length byte'并有效地固定了字符串的长度。 SetLength(s,w)将是现代等价物。