W takim razie, aby z ciągu znaków o zawartości '$3d $33'
zrobić natywną liczbę, musisz skopiować dwa podciągi określające liczby i dopiero wtedy przekonwertować je na liczby. Przykład niżej:
uses
SysUtils;
function StringToSmallInt(APointer: Pointer): SmallInt;
var
ResBytes: packed array [0 .. 1] of Byte absolute Result;
RawValue: AnsiString;
begin
RawValue := PAnsiChar(APointer);
ResBytes[0] := StrToInt(Copy(RawValue, 5, 3));
ResBytes[1] := StrToInt(Copy(RawValue, 1, 3));
end;
var
Value: SmallInt;
begin
Value := StringToSmallInt(PChar('$3d $33'));
Write('Value: ', Value);
end.
Dla nowszych Delphi i Lazarusa może wyglądać tak (z użyciem wbudowanych helperów):
uses
SysUtils;
function StringToSmallInt(APointer: Pointer): SmallInt;
var
ResBytes: packed array [0 .. 1] of Byte absolute Result;
RawValue: AnsiString;
begin
RawValue := PAnsiChar(APointer);
ResBytes[0] := RawValue.Substring(4, 3).ToInteger();
ResBytes[1] := RawValue.Substring(0, 3).ToInteger(); // 0-based, to ci heca
end;
W drugą stronę też nie jest zbyt trudno:
function SmallIntToString(APointer: Pointer): AnsiString;
var
ValBytes: packed array [0 .. 1] of Byte; // packed opcjonalny
begin
ValBytes[0] := PByte(APointer + 1)^;
ValBytes[1] := PByte(APointer + 0)^;
Result := Format('$%2.2x $%2.2x', [ValBytes[0], ValBytes[1]]);
end;
W przypadku braku wsparcia dużych liter dupnij sobie na koniec ToLower
(lub użyj LowerCase
).
Przykład działania tutaj: https://ideone.com/1g0m57