1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| type
PBinBuffer = ^TBinBuffer;
TBinBuffer = packed array[0..0] of byte;
TBuffer = record
bbSize : LongWord;
bbPBuff : PBinBuffer;
end;
procedure BinBufferToStr(aBuffer: TBuffer; var hxStr: ansiString);
var N : integer;
pB : ^Word;
const
BTC : array[$0..$F] of byte = ($30, $31, $32, $33, $34, $35, $36, $37, $38, $39,
$61, $62, $63, $64, $65, $66);
begin
SetLength(hxStr, aBuffer.bbSize shl 1);
pB := @hxStr[1];
for N := 0 to aBuffer.bbSize-1 do
begin
pB^ := BTC[aBuffer.bbPBuff[N] shr 4] or (BTC[aBuffer.bbPBuff[N] and $F] shl 8);
inc(pB);
end;
end;
procedure StrToBinBuffer(hxStr: ansiString; var aBuffer: TBuffer);
var N, L, B, P : integer;
HC : ansiString;
pB : PBinBuffer;
begin
L := Length(hxStr);
pB := PBinBuffer(hxStr);
aBuffer.bbSize := 0;
aBuffer.bbPBuff := AllocMem(L shr 1);
P := 1;
for N := 0 to L-1 do
begin
B := -1;
case pB[N] of
48..57 : B := (pB[N] - 48);
65..70 : B := (pB[N] - 55);
97..102 : B := (pB[N] - 87);
end;
if B in [$0..$F] then
begin
if P = 0 then
begin
aBuffer.bbPBuff[aBuffer.bbSize] := aBuffer.bbPBuff[aBuffer.bbSize] or B;
inc(aBuffer.bbSize);
P := 1;
end
else
begin
aBuffer.bbPBuff[aBuffer.bbSize] := B shl 4;
P := 0;
end;
end;
end;
if P = 0 then
inc(aBuffer.bbSize);
ReAllocMem(aBuffer.bbPBuff, aBuffer.bbSize);
end; |
Partager