Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Создать файл имея двоичный текст


Автор: naz191 26.11.2010, 08:19
Есть у меня содержание одной картинки в виде hex (ну и bin - перевел). Содержание вытащил из картинки и перевел в текст в виде hex
Пробую "собрать" файл...
только вот создает файл текстовой - т.е. Я ввожу в мемо код (hex, bin). По идее прога должна конвертировать его в Нормальный рабочий *.png. 
В место этого получаю тот же текст только в *.png и в результате *.png не читабелен (((
Код

var
  f: TMemoryStream;
  S: AnsiString;
begin
  f := TMemoryStream.Create;
  s:= memo1.Text;
  try
    f.Write(S[1], Length(S));
    f.SaveToFile('filename.png');
  finally
    f.Free;
  end;

 В чем моя ошибка? Ну или подсказку?

Автор: Snowy 26.11.2010, 13:30
Не понятно.
Покажи кусок текста.

Автор: imageman 29.11.2010, 10:34
подозреваю, что memo1.Text не может содержать все 256 символов (с кодами от 0 до 255).

Если в memo1 строка типа '012abc', то её ещё нужно сконвертировать.

А вообще, действительно, нужно посмотреть пример строки 

Автор: naz191 30.11.2010, 09:00
Цитата(imageman @ 29.11.2010,  10:34)
пример строки

Вот кусочки... первый в Hex
Код

89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52
00 00 02 5d 00 00 01 ae 08 02 00 00 01 52 09 14
c0 00 00 00 06 62 4b 47 44 00 ff 00 ff 00 ff a0
bd a7 93 00 00 00 09 70 48 59 73 00 00 0e c4 00
00 0e c4 01 95 2b 0e 1b 00 00 20 00 49 44 41 54
78 da ec 5d 7f 74 54 55 7e 7f c0 41 70 f7 8f da
b3 3d 7b 50 cf 69 e5 74 e9 56 ed 7a 0a ba db 45
1a ec 5a 4f f1 08 6c 0b 42 65 11 d9 60 d6 88

Второй двоичный
Код

10001001 01010000 01001110 01000111 00001101 00001010 00011010 00001010 00000000 00000000 00000000 00001101 01001001 01001000 01000100 01010010
00000000 00000000 00000010 01011101 00000000 00000000 00000001 10101110 00001000 00000010 00000000 00000000 00000001 01010010 00001001 00010100
11000000 00000000 00000000 00000000 00000110 01100010 01001011 01000111 01000100 00000000 11111111 00000000 11111111 00000000 11111111 10100000
10111101 10100111 10010011 00000000 00000000 00000000 00001001 01110000 01001000 01011001 01110011 00000000 00000000 00001110 11000100 00000000
00000000 00001110 11000100 00000001 10010101 00101011 00001110 00011011 00000000 00000000 00100000 00000000 01001001 01000100 01000001 01010100
01111000 11011010 11101100 01011101 01111111 01110100 01010100 01010101 01111110 01111111 11000000 01000001 01110000 11110111 10001111 11011010
10110011 00111101 01111011 01010000 11001111 01101001 11100101 01110100 11101001 01010110 11101101 01111010 00001010 10111010 11011011 01000101
00011010 11101100 01011010 01001111 11110001 00001000 01101100 00001011 01000010 01100101 00010001 11011001 01100000 11010110 10001000



Автор: imageman 30.11.2010, 16:40
 отсюда http://sources.ru/delphi/algorithms/hextoint_inttobin_bintoint.shtml взять преобразователь 16в10 систему счисления

пары цифр (0d) прогонять через нее и прибавлять к строке. т.е. что-то вроде

var s:AnsiString;

s:=s+chr( HexToInt('0d') );

а потом строку s писать в файл как ты хотел

(надеюсь не попутал ничего)

Автор: RinOSpro 2.12.2010, 15:20
Для Hex:

Код

function HexToString(AHexStr: String): String;
var
  i: Integer;
begin
  AHexStr := StringReplace(AHexStr, ' ', '', [rfReplaceAll]);
  SetString(Result, Nil, Length(AHexStr) div 2);
  for i := 1 to Length(AHexStr) div 2 do
    Result[i] := Char(StrToInt('$' + AHexStr[2 * i - 1]+AHexStr[2 * i]));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  LHexStr: string;
  LStr: string;
  LMs: TMemoryStream;
begin
  LHexStr := '89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52' +
    '00 00 02 5d 00 00 01 ae 08 02 00 00 01 52 09 14' +
    'c0 00 00 00 06 62 4b 47 44 00 ff 00 ff 00 ff a0' +
    'bd a7 93 00 00 00 09 70 48 59 73 00 00 0e c4 00' +
    '00 0e c4 01 95 2b 0e 1b 00 00 20 00 49 44 41 54' +
    '78 da ec 5d 7f 74 54 55 7e 7f c0 41 70 f7 8f da' +
    'b3 3d 7b 50 cf 69 e5 74 e9 56 ed 7a 0a ba db 45' +
    '1a ec 5a 4f f1 08 6c 0b 42 65 11 d9 60 d6 88';

  LStr := HexToString(LHexStr);

  LMs := TMemoryStream.Create;
  try
    LMs.Write(LStr[1], Length(LStr));
    LMs.SaveToFile('c:\123.png');
  finally
    LMs.Free;
  end;
end;

Автор: remax 3.12.2010, 02:47
В принципе, в Delphi уже есть готовая функция HexToBin.
function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer 

и обратная ей процедура BinToHex 
procedure BinToHex(Buffer, Text: PChar; BufSize: Integer);


и живут они в Classes   smile 

Автор: Snowy 3.12.2010, 14:42
Цитата(remax @  3.12.2010,  02:47 Найти цитируемый пост)
В принципе, в Delphi уже есть готовая функция HexToBin.function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer и обратная ей процедура BinToHex procedure BinToHex(Buffer, Text: PChar; BufSize: Integer);и живут они в Classes    
И какое отношение они имеют к данной задаче?
Они умеют пилить шестнадцатиричный текст по пробелам и переводить его в стрим?
Вряд ли...  smile 

Автор: remax 3.12.2010, 14:54
Цитата(Snowy @ 3.12.2010,  14:42)
Цитата(remax @  3.12.2010,  02:47 Найти цитируемый пост)
В принципе, в Delphi уже есть готовая функция HexToBin.function HexToBin(Text, Buffer: PChar; BufSize: Integer): Integer и обратная ей процедура BinToHex procedure BinToHex(Buffer, Text: PChar; BufSize: Integer);и живут они в Classes    
И какое отношение они имеют к данной задаче?
Они умеют пилить шестнадцатиричный текст по пробелам и переводить его в стрим?
Вряд ли...  smile

такое же самое отношение, что и HexToInt, на который ссылается imageman. Только это стандартная функция и немного более функциональная....

 Да, для того чтобы использовать надо сперва пробелы убрать, например так: 
HexStr := StringReplace(HexStr, ' ', '', [rfReplaceAll]);
Ну, а дальше уже дело техники...
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)