V Delphi XE7 prevádzame niektoré hodnoty z reťazca na bajty a z bajtov na reťazec pomocou:
MyBytes := TEncoding.Unicode.GetBytes(MyString);
a
MyString := TEncoding.Unicode.GetString(MyBytes);
Chcel by som napísať svoje vlastné funkcie, ktoré majú rovnaké výsledky ako Delphi-2007. Ja naozaj neviem, čo sa týka kódovania znakov, predpokladám, že by som mal používať typ WideString v Delphi-2007 (je to tak?)
function StringToBytes(AValue : WideString) : TBytes;
begin
Result := //...
end;
function BytesToString(AValue : TBytes) : WideString;
begin
Result := //...
end;
Môže mi niekto pomôcť pri písaní týchto dvoch funkcií?
odpovede:
4 pre odpoveď č. 1Od a WideString
je kódovaný UTF-16 a chcete mať bajtové pole kódované UTF-16, nie je potrebná žiadna konverzia. Môžete vykonať priamu kópiu pamäte, ako je táto:
function StringToBytes(const Value : WideString): TBytes;
begin
SetLength(Result, Length(Value)*SizeOf(WideChar));
if Length(Result) > 0 then
Move(Value[1], Result[0], Length(Result));
end;
function BytesToString(const Value: TBytes): WideString;
begin
SetLength(Result, Length(Value) div SizeOf(WideChar));
if Length(Result) > 0 then
Move(Value[0], Result[1], Length(Value));
end;