[英]delphi a fast way to convert hex string to binary string
我必須像這樣將十六進制字符串轉換為二進制字符串
"F" -> "1111"
"A" -> "1010"
"1AF1" -> "1101011110001"
我有這個功能:
function HexToBin(Hexadecimal: string): string;
const
BCD: 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(Hexadecimal) downto 1 do
Result := BCD[StrToInt('$' + Hexadecimal[i])] + Result;
end;
我這樣稱呼它:
for I := 0 to Trunc(tcpFrame.Length/100) do
begin
str := copy(tcpFrame , (I*100)+1 , 100 );
data := data + HexToBin( str );
end;
但這對於像 50-60 MB 的字符串這樣的大數據來說真的很慢
有沒有更好更快的方法呢?
我相信主要問題是您一次向字符串追加一部分。
在 Delphi 中,通過一次添加一個小部分來構建動態數組或字符串非常慢。 更好的方法是將數組/字符串預先分配為較大的大小,然后填充其內容。 如果一開始就知道最后的長度,就用這個size; 否則,以大塊分配。
在這種情況下,我們確實知道最終長度。
這個想法的一個示例實現:
function HexStrToBinStr(const AHexStr: string): string;
var
i, j: Integer;
const
HexParts: array[0..$F] of string =
(
{0} '0000',
{1} '0001',
{2} '0010',
{3} '0011',
{4} '0100',
{5} '0101',
{6} '0110',
{7} '0111',
{8} '1000',
{9} '1001',
{A} '1010',
{B} '1011',
{C} '1100',
{D} '1101',
{E} '1110',
{F} '1111'
);
begin
SetLength(Result, 4 * AHexStr.Length);
j := 1;
for i := 1 to AHexStr.Length do
begin
case AHexStr[i] of
'0'..'9':
Move(HexParts[Ord(AHexStr[i]) - Ord('0')][1], Result[j], sizeof(char) * 4);
'A'..'F':
Move(HexParts[$A + Ord(AHexStr[i]) - Ord('A')][1], Result[j], sizeof(char) * 4);
'a'..'f':
Move(HexParts[$A + Ord(AHexStr[i]) - Ord('a')][1], Result[j], sizeof(char) * 4);
else
raise EConvertError.CreateFmt('Invalid hexadecimal string "%s".', [AHexStr]);
end;
Inc(j, 4);
end;
end;
我不計算中間'$' + Hexadecimal[i]
字符串並調用StrToInt
也可能會加快速度。
額外練習:作為額外練習,通過添加參數APrettyPrint: Boolean = False
修改此代碼,如果為True
,則在每組四位之間添加一個空格。 當然,您仍然應該預先分配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.