JSON - это текстовый формат, он вообще не предусматривает обработки двоичных данных. Почему байты изображения не кодируются в текстово-совместимом формате, например base64 , base85 , base91 и т. Д.? В противном случае используйте вместо этого что-то вроде BSON (двоичный JSON) или UBJSON (универсальный двоичный JSON), которые поддерживают двоичные данные.
В любом случае, BytesOf()
будет повреждать байты, поскольку он использует языковой стандарт пользователя по умолчанию (через TEncoding.Default
, который является UTF-8 на платформах, отличных от Windows!), Поэтому символы вне диапазона ASCII являются объектом интерпретация локали и не будет производить нужные вам байты.
В вашей ситуации, убедитесь, что библиотека JSON декодирует файл JSON как UTF-8, тогда вы можете просто перебрать полученную строку (библиотека JSON должна анализировать экранированные последовательности в символы для вас) и обрезать символы как есть до 8-битных значений. Не выполняйте преобразование кодировок вообще. Например:
var
imageString : string;
imageBytes: TBytes;
i: Integer;
...
begin
...
imageString := jv.GetValue<string>('ImageData');
SetLength(imageBytes, Length(imageString));
for i := 0 to Length(imageString)-1 do begin
imageBytes[i] := Byte(imageString[i+1]);
end;
SaveBytesToFile(imageBytes, pathFile);
...
end;
![image](https://i.stack.imgur.com/kkL8N.png)
Кстати, ваш SaveBytesToFile()
может быть значительно упрощен, не тратя память на копирование TBytes
:
procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
stream: TBytesStream;
begin
stream := TBytesStream.Create(Data);
try
stream.SaveToFile(FileName);
finally
stream.Free;
end;
end;
Или:
procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
var
stream: TFileStream;
begin
stream := TFileStream.Create(FileName, fmCreate);
try
stream.WriteBuffer(PByte(Data)^, Length(Data));
finally
stream.Free;
end;
end;
Или:
uses
..., System.IOUtils;
procedure SaveBytesToFile(const Data: TBytes; const FileName: string);
begin
System.IOUtils.TFile.WriteAllBytes(FileName, Data);
end;