ДНК Кодировщик
Запись от Tails размещена 11.01.2016 в 08:24
Обновил(-а) Tails 18.01.2016 в 11:45 (Применил стандартное форматирование кода)
Обновил(-а) Tails 18.01.2016 в 11:45 (Применил стандартное форматирование кода)
Выдалась бессонная ночка. Вдохновившись этой статьей, решил создать свою JPG бактерию! Для начала, нужно было создать конвертер - машинные данные -> днк.
пс. Статья носит развлекательный характер
Итак, получилось набрасать примерно такой кодировщик, переводящий обычные, бинарные данные в днк формат:
package { import flash.display.Sprite; import flash.errors.IllegalOperationError; import flash.events.Event; import flash.utils.ByteArray; /** * ДНК Кодировщик. * @author Tails */ public class Main extends Sprite { // ДНК Алфавит: static private const A:String = "A"; static private const B:String = "G"; static private const C:String = "C"; static private const D:String = "T"; public function Main() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); const message:String = "Привет, о дивный мир!"; var bytes:ByteArray = new ByteArray; bytes.writeUTFBytes(message); var dnk:String = encode(bytes); bytes = decode(dnk); trace("Исходное сообщение:", message); trace("Кодирование в ДНК:", dnk); trace("Декодирование ДНК (Обратное):", bytes.readUTFBytes(bytes.length)); } // ПРИВАТ // Кодирование: private function encode(bytes:ByteArray):String { if (bytes === null) throw new ArgumentError("null value"); bytes.position = 0; var dnk:String = ''; var i:uint = bytes.length; var j:uint; var length:uint; var dnkByte:String; while (i--) { dnkByte = bytes.readUnsignedByte().toString(4); length = dnkByte.length; // Нулевые биты: if (length === 1) dnk = dnk + A + A + A; else if (length === 2) dnk = dnk + A + A; else if (length === 3) dnk = dnk + A; // Значение: j = 0; while (j < length) { dnk = dnk + getDnkChar(dnkByte.charAt(j++)); } } bytes.position = 0; return dnk; } private function getDnkChar(char4:String):String { if (char4 === '0') return A; if (char4 === '1') return B; if (char4 === '2') return C; if (char4 === '3') return D; throw new IllegalOperationError("Unknown char - " + char4); } // Декодирование: private function decode(dnk:String):ByteArray { if (dnk === null) throw new ArgumentError("null value"); if (dnk.length === 0) return new ByteArray; const bytes:ByteArray = new ByteArray; const length:uint = dnk.length / 4; var i:uint; var j:uint; var char:String; var dnkByte:String; while (i < length) { dnkByte = ''; j = 0; while (j < 4) { char = dnk.charAt(i * 4 + j); j++; if (char === A && dnkByte.length === 0) continue; dnkByte = dnkByte + getNumFromDnk(char); } i++; if (dnkByte.length === 0) bytes.writeByte(0); else bytes.writeByte(parseInt(dnkByte, 4)); } bytes.position = 0; return bytes; } private function getNumFromDnk(dnkChar:String):String { if (dnkChar === A) return '0'; if (dnkChar === B) return '1'; if (dnkChar === C) return '2'; if (dnkChar === D) return '3'; throw new IllegalOperationError("Unknown char - " + dnkChar); } } }
Код:
Исходное сообщение: Привет, о дивный мир! Кодирование в ДНК: TGAACGTTTGAGCAAATGAACTCATGAACTACTGAACTGGTGAGCAACACTAACAATGAACTTCACAATGAACTGATGAACTCATGAACTACTGAACTTGTGAGCACTTGAACTCGACAATGAACTTATGAACTCATGAGCAAAACAG Декодирование ДНК (Обратное): Привет, о дивный мир!
Попозже (если выдастся ещё одна бессонная ночка) добавлю некоторый гуи интерфейс, для выбора произвольных файлов из файловой системы. Тогда можно будет выбрать таки .jpg и закодировать его в днк! После, останется только раздобыть молекулярный принтер, распечатать получившуюся бактерию и ... выпустить её в свободное плавание!
Всем бессонных ночей!
Всего комментариев 10
Комментарии
11.01.2016 10:50 | |
Сразу видно, что устал отдыхать.
|
11.01.2016 16:10 | |
Да, было такое )
|
12.01.2016 13:35 | |
А подскажите мне, где обучают написанию не читаемого кода или это в ДНК у некоторых?
|
12.01.2016 13:43 | |
Что конкретно не понравилось?
|
12.01.2016 14:08 | |
Форматирование табами
|
17.01.2016 21:57 | |
Да, форматирование напугало
|
17.01.2016 22:47 | |
а подскажите, как в код внутри сообщение вставлять символ табуляции? А то меня начинает кидать по кнопкам/ссылкам.
|
18.01.2016 11:48 | |
Применил стандартное оформление.
undefined, Его (символ табуляции) можно скопировать из текстового редактора, ctr+c ctl+v. |
18.01.2016 18:24 | |
Ну вот теперь этот код еще бы отрефакторить, чтобы он стал компактнее и еще более читабельнее.
|
24.01.2016 23:11 | |
Интересненько
|
Последние записи от Tails
- ДНК Кодировщик (11.01.2016)
- Глюк с normalize в Pixel Bender после 11 версий плеера. (20.08.2015)
- SWF to PNG Converter (29.06.2013)
- Сеттер геттер vs прямой доступ (18.04.2013)
- Основы создания 2д анимации на примере (25.02.2012)