簡體   English   中英

delphi 一種將十六進制字符串轉換為二進制字符串的快速方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM