经常用到2进制转16进制,十进制转十六进制的,但网上搜的,很多还是觉得不大好用,借鉴了一下别人的代码,并顺便总结一下:
首先,十进制和十六进制之间的转换,实际是比较简单的。
1.十六进制转十进制(加$符号就可以的了): i:=strtoint('$'+HexStr), HexStr为十六进制字符串,比如1F2D,注意不超过64位,即1个16进制字符代表4位,共不能超过16个十六进制字符,可以在输入edit中限制maxlength=16,就不会转换出错的了。
2.十进制转十六进制:用format,很简单的,但却发现不少人没常用。 HexStr :=Format(‘%x’,[i]); 还可以让Hexstr固定宽度显示(大于固定位则显示整个Hexstr,小于则补0显示),比如:HexStr :=Format(‘%4x’,[i]);
首先,十进制和十六进制之间的转换,实际是比较简单的。
1.十六进制转十进制(加$符号就可以的了): i:=strtoint('$'+HexStr), HexStr为十六进制字符串,比如1F2D,注意不超过64位,即1个16进制字符代表4位,共不能超过16个十六进制字符,可以在输入edit中限制maxlength=16,就不会转换出错的了。
2.十进制转十六进制:用format,很简单的,但却发现不少人没常用。 HexStr :=Format(‘%x’,[i]); 还可以让Hexstr固定宽度显示(大于固定位则显示整个Hexstr,小于则补0显示),比如:HexStr :=Format(‘%4x’,[i]);
3.剩下16进制<->2进制互转的问题,结果以前偷懒,网上用的BinToHex还是错误的,而且不容易发现,是偶尔发现的,还是自己重新写了一个。
//16进制转2进制
function HextoBinary(Hex:string;const Spliter:string=''):string;
const
BinList: array [0..15] of string =
('0000','0001','0010','0011',
'0100','0101','0110','0111',
'1000','1001','1010','1011',
'1100','1101','1110','1111');
var
i:integer;
begin
Result:='';
for i:=Length(Hex) downto 1 do
Result:=BinList[StrToInt('$'+Hex[i])]+Spliter+Result;
end;
//2进制转16进制
function BinStrToHexStr(BinStr:string;const Spliter:string=''):string;
function HalfByteStrToHexStr(BinStr:string):string; //4位二进制转换为半字节,比如1111->F
const
BinList: array [0..15] of string =
('0000','0001','0010','0011',
'0100','0101','0110','0111',
'1000','1001','1010','1011',
'1100','1101','1110','1111');
var i,j:Byte;
begin
Result :='';
if Length(BinStr)>4 then Exit;
for i:=0 to 15 do
if BinStr=BinList[i]
then
begin
Result :=Format('%1x',[i]);
Exit;
end;
end;
var OneByte:Byte;
i,j,Len:integer;
OneByteStr,HalfByteStr:string;
begin
Result :='';
BinStr :=StringReplace(BinStr,' ','',[rfReplaceAll]); //可以输入空格
Len := Length(BinStr);
i := Len mod 4;
if i<>0 //若不是刚好4位一组,则需补0
then
begin
for j:=4-i downto 1 do
BinStr :='0'+BinStr;
end;
Len := Length(BinStr);
while Len>0 do
begin
HalfByteStr :=Copy(BinStr,Len-3,4);
Dec(Len,4);
Result :=HalfByteStrToHexStr(HalfByteStr)+Result ;
end;
end;