3

16進文字列に変換してからバイト配列に戻したいバイト配列があります。

私は以下を使用して16進文字列に変換しています:

function bintoHex(const bin: array of byte): String;
const HexSymbols = '0123456789ABCDEF';
var i: integer;
begin
  SetLength(Result, 2*Length(bin));
  for i :=  0 to Length(bin)-1 do begin
    Result[1 + 2*i + 0] := HexSymbols[1 + bin[i] shr 4];
    Result[1 + 2*i + 1] := HexSymbols[1 + bin[i] and $0F];
  end;
end;

それをバイト配列に適切に変換する方法がわかりません。私は次のようなものを撮影しています:

Type TDCArray = Array of Byte;

function xHexToBin(const HexStr: String): TDCArray;
const HexSymbols = '0123456789ABCDEF';
var i: integer;
begin
  SetLength(Result, ???); //Need to now get half of the length, unsure how to go about that
  for i :=  0 to Length(HexStr)-1 do begin
    //Here convert back into an array somehow...
    //Result[i] := ???
  end;
end;

どうすればこれを行うことができますか?

また、Delphi XE2 を使用しています。

4

4 に答える 4

14

BinToHexおよびHexToBinRTL 関数を使用しないのはなぜですか?

{$APPTYPE CONSOLE}

uses
  System.Classes,
  System.SysUtils;

var
  LArray : array[1..6] of Byte = (10, 11, 12, 13, 14, 15);
  LText: string;
  I : integer;
begin
  try
    SetLength(LText, Length(LArray)*2);
    BinToHex(@LArray, PChar(LText), SizeOf(LArray));
    //show the hex string
    Writeln(LText);

    //fill the array with 0 
    FillChar(LArray, SizeOf(LArray), #0);

    //get the values from the hex string
    HexToBin(PChar(LText), @LArray, Length(LArray));

    //show the array values
    for i := 1 to Length(LArray) do
      Write(LArray[i]);
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
于 2012-10-19T20:43:41.607 に答える
4

2つの16進文字は1バイトを表します

私が以前に書いたコードは、私があなたにアイデアを手に入れて欲しかった擬似コードでした。ただし、ここに貼り付けるコードが必要な場合は、実際の実装は次のとおりです。

program project1;

uses SysUtils,classes;


type
  TByteArray = array of byte;
function StrToArray(const Hexstr: String): TByteArray ;
var
i: Integer;
begin
SetLength(Result, Length(Hexstr) div 2);
for i:=0 to (Length(Hexstr) div 2 - 1) do
        Result[i]:= StrToInt('$' + Copy(Hexstr, (i * 2) + 1, 2));
end;


var
   arr : TByteArray;
   i : Integer;
begin
  arr := StrToArray('0A0B0C0D');
  for i:=0 to High(arr) do
          WriteLn(arr[i]);
  Readln;
end.   

ところで、コーディングはカットアンドペーストではありません;)

于 2012-10-19T19:58:42.520 に答える
4

自分でやりたい場合:

function xHexToBin(const HexStr: String): TBytes;
const HexSymbols = '0123456789ABCDEF';
var i, J: integer;
    B: Byte;
begin
  SetLength(Result, (Length(HexStr) + 1) shr 1);
  B:= 0;
  i :=  0;
  while I < Length(HexStr) do begin
    J:= 0;
    while J < Length(HexSymbols) do begin
      if HexStr[I + 1] = HexSymbols[J + 1] then Break;
      Inc(J);
    end;
    if J = Length(HexSymbols) then ; // error
    if Odd(I) then
      Result[I shr 1]:= B shl 4 + J
    else
      B:= J;
    Inc(I);
  end;
  if Odd(I) then Result[I shr 1]:= B;
end;
于 2012-10-19T20:12:36.480 に答える