Консультация № 193648
05.10.2018, 17:53
0.00 руб.
0 6 1
Здравствуйте !
На ассемблере не программировал. Решил выбрать FASM.
Есть текстовый файл с символами типа "00 0f ab 01..." (шестнадцатиричные коды) надо записать в бинарный файл на FASM для Windows x86. функция(имятекстфайла, имябинарногофайла)
Кому не лень. Подскажите, или дайте ссылку с примерами.

Обсуждение

давно
Посетитель
402218
66
05.10.2018, 19:50
общий
для уточнения, у Вас есть файл, "файл.txt" в котором есть готовый код с директивами который подойдёт для fasm?
Потому что возможно Вы, судя по написанному, описываете уже скомпилированный бинарный(.bin) или екзешный файл (.exe) в хекс формате, который мог бы пригодится Вам на этапе работы с отладчиком.
давно
Посетитель
402327
2
05.10.2018, 20:14
общий
Адресаты:
Просто я перевел с помощью PHP-функций бинарный файл в текстовый с 16-ми кодами типа "6f 3a 01 aa ..", чтоб передать его через POST-запрос своему веб-серверу. А теперь мне надо, чтоб из такого текстового вновь собрать бинарный. С помощью PHP пока не получается, может из-за плохого знания PHP (его функции коды в символы преобразует, а мне надо просто байты в файл записать). Решил сделать на FASM. К тому же я потом могу сделать DLL-ку и подключать ее.
давно
Старший Модератор
31795
6196
05.10.2018, 23:00
общий
Адресаты:
Вы хоть сами поняли, что тут написано:
Цитата: andreosh
Есть текстовый файл с символами типа "00 0f ab 01..." (шестнадцатиричные коды) надо записать в бинарный файл на FASM для Windows x86. функция(имятекстфайла, имябинарногофайла)

На сколько я понял, Вам нужно !6-ти битный код текстового файла скопировать в бинарный файл.

функция 56h прерывания 21h переименовывает файл, но это в том случае, когда оригинал файла Вам не нужен.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
05.10.2018, 23:17
общий
Адресаты:
Цитата: andreosh
чтоб передать его через POST-запрос своему веб-серверу

Ну батенька, тут клиент-сервер, должны понимать, о чем они говорят, и сервер получивший информацию, должен знать как с ней работать.

Клиент- Серверу: "БЕЛИБЕРДА"
Сервер-> Клиенту: "Ты уверен"
Клиент- Серверу:"Таки Да"

Вам это не напоминает 17-ть мгновений?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
402327
2
06.10.2018, 11:13
общий
10.10.2018, 08:28
Адресаты:
Что-то вы все усложняете. Я уже решил эту задачу на PHP без 16-ичных кодов, так как они бинарный файл увеличат в 2 раза. Мой алгоритм увеличивает в 1.5 раз бинарный файл. Привожу исходники:
(Правда, имеется костыль: почему-то уничтожаются первые 2 байта, приходится добавлять, например, при раскодировании
архива rar, $param="Ra". Может потом исправлю этот глюк, но пока и с ним можно работать.)
Суть алгоритма в том, что бинарные коды переводятся в символы, допустимые для передачи через POST-запрос.
Затем раскодируется вновь в бинарный файл. Так есть ограничение на размер файла 320000 байта (при большем размере
функция выдает ошибку)

Может кто-нибудь улучшит алгоритм. Но для моих нужд и так сойдет.
[code lang=php] function KodirTextFileToBinarFile($fileread,$filewrite,$param) {
$data = $param.file_get_contents($fileread,false,NULL,1,320000); $counter = strlen($data);
$file = fopen($filewrite, 'wb'); $char1 = "";
for($i = 0; $i < $counter; ++$i) { $char2 = $data[$i]; echo $char2;
if (($char1=="!") or ($char1==""")) { if (($char1=="!") and ($char2=="!")) { $CharOut = 256; }
else { if ($char1==""") { fwrite($file, pack("C",ord($char2)+80)); } else { if ($char1=="!") {
fwrite($file, pack("C",ord($char2)-35));
} } $char1 = ""; }
}
else { if (($char2=="!") or ($char2==""")) { $char1 = $char2; } else { fwrite($file, $char2); } }

}
fclose($file);
}
function KodirBinarFileToTextFile($fileread,$filewrite) { $StrOut = ""; $CharOut = "";
$data = file_get_contents($fileread, NULL, NULL, 1, 320000); $counter = strlen($data);
for($i = 0; $i < $counter; ++$i) { $char = ord($data[$i]); $CharOut = byteToChar($char);
$StrOut = $StrOut.$CharOut; }
file_put_contents($filewrite, $StrOut);
}
function byteToChar($byte1) { $simv = '_';
if ((($byte1>34) and ($byte1<123)) or (($byte1>191) and ($byte1<256))) {
$simv = chr($byte1); } else { if ($byte1<35) { $simv = "!".chr($byte1+35); } else {
if ($byte1==256) { $simv = "!!"; } else { $simv = """.chr($byte1-80); } } } return $simv;
}[/code]

Но данная задача изначально решалась по не знанию о наличие функции base64 в PHP. По сути, произошло "изобретение велосипеда", причем худшего качества, так как base64 увеличивает файл на 30%, а мой алгоритм на 50%
давно
Посетитель
7438
7205
09.10.2018, 18:12
общий
это ответ
Здравствуйте, andreosh!
Задача решена автором вопроса средствами PHP
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа