Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Tails

Оценить эту запись

ДНК Кодировщик

Запись от Tails размещена 11.01.2016 в 08:24
Обновил(-а) Tails 18.01.2016 в 11:45 (Применил стандартное форматирование кода)

Выдалась бессонная ночка. Вдохновившись этой статьей, решил создать свою JPG бактерию! Для начала, нужно было создать конвертер - машинные данные -> днк.
пс. Статья носит развлекательный характер

Итак, получилось набрасать примерно такой кодировщик, переводящий обычные, бинарные данные в днк формат:
Код AS3:
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);
		}
	}
}
И получился такой, первый Hello World:
Код:
Исходное сообщение: Привет, о дивный мир!
Кодирование в ДНК: TGAACGTTTGAGCAAATGAACTCATGAACTACTGAACTGGTGAGCAACACTAACAATGAACTTCACAATGAACTGATGAACTCATGAACTACTGAACTTGTGAGCACTTGAACTCGACAATGAACTTATGAACTCATGAGCAAAACAG
Декодирование ДНК (Обратное): Привет, о дивный мир!
В целом, кодирование очень простое. Если не углубляться сильно, то днк имеет 4-чную систему счисления. Мы просто переводим двоичные байты в алфавит из 4 букв. Природа запасла много разных механизмов и нюансов, например стоп коды, для обозначения концов кодирования белков, или слипание нитей днк, если там слишком много одинаковых "битов", идущих подряд. Но мы пока сделаем попроще.

Попозже (если выдастся ещё одна бессонная ночка) добавлю некоторый гуи интерфейс, для выбора произвольных файлов из файловой системы. Тогда можно будет выбрать таки .jpg и закодировать его в днк! После, останется только раздобыть молекулярный принтер, распечатать получившуюся бактерию и ... выпустить её в свободное плавание!

Всем бессонных ночей!
Всего комментариев 10

Комментарии

Старый 11.01.2016 10:50 GBee вне форума
GBee
 
Аватар для GBee
Сразу видно, что устал отдыхать.
Старый 11.01.2016 16:10 Tails вне форума
Tails
 
Аватар для Tails
Да, было такое )
Старый 12.01.2016 13:35 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
А подскажите мне, где обучают написанию не читаемого кода или это в ДНК у некоторых?
Старый 12.01.2016 13:43 Tails вне форума
Tails
 
Аватар для Tails
Что конкретно не понравилось?
Старый 12.01.2016 14:08 GBee вне форума
GBee
 
Аватар для GBee
Форматирование табами
Старый 17.01.2016 21:57 MikroAcse вне форума
MikroAcse
 
Аватар для MikroAcse
Да, форматирование напугало
Старый 17.01.2016 22:47 undefined вне форума
undefined
а подскажите, как в код внутри сообщение вставлять символ табуляции? А то меня начинает кидать по кнопкам/ссылкам.
Старый 18.01.2016 11:48 Tails вне форума
Tails
 
Аватар для Tails
Применил стандартное оформление.

undefined,
Его (символ табуляции) можно скопировать из текстового редактора, ctr+c ctl+v.
Старый 18.01.2016 18:24 СлаваRa вне форума
СлаваRa
 
Аватар для СлаваRa
Ну вот теперь этот код еще бы отрефакторить, чтобы он стал компактнее и еще более читабельнее.
Старый 24.01.2016 23:11 Wormhole вне форума
Wormhole
 
Аватар для Wormhole
Интересненько
 

 


Часовой пояс GMT +4, время: 03:25.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.