Pull to refresh

Comments 32

UFO just landed and posted this here
Небольшой совет и сравнение скорости работы с массивами (про биты в моём комменте речи не идет).

$str = 'a'x100;
cmpthese (300, {'Arr copy' => sub {
          my @bin = ();
          for (my $i=0; $i < length($str); $i++) {
                  @bin = (@bin, split ('', sprintf "%08b", ord(substr($str, $i, 1))));
          }
},
'String' => sub {
          my $bin = '';
          my @bin = ();
          my @t = split (//, $str);
          for (my $i=0; $i <= $#t; $i++) {
                   $bin .= sprintf ("%08b", ord($t[$i]));
          }
          @bin = split '', $bin;
},
'Arr push' => sub {
          my @bin = ();
          for (my $i=0; $i < length($str); $i++) {
               push @bin, split ('', sprintf "%08b", ord(substr($str, $i, 1)));
          }
}
});

И результат производительности для сравнения:
                 Rate         Arr copy   String     Arr push   
Arr copy        17.0/s         --        -98%       -99%
String          800/s         4617%       --        -37%
Arr push        1277/s        7427%      60%         --

Чем длиннее строка, тем больше в производительности будет выигрывать «Arr push» метод.
Спасибо!
Думал использовать push но решил что скорость будет порядка 'Arr copy.
Ну, будет уроком на будущее.)
Ну а работать с байтами проще и быстрее было бы с помощью логических операторов, таких как: "&, |, ^, >>, <<".
Моя задача — заменить два младших бита в байте на нужные. Возможно неправ, но не вижу способа выполнить ее одними логическими операторами, хотя возможно он есть. Попробую вечером.
Самое топорное и простое решение:
my $str = 255; # or other .. $str = 'a';
my @now = (1,0);
$str = ($str & 252) | (($now[0] << 1) | $now[1]);
Только

$str = ($str & 0xFC) | (($now[0] << 1) | $now[1]);

Ну и, наверное, будет что-то типа

$str = ($str & 0xFC) | (($src[$i >> 2] >> (($i & 0x3 ) << 1)) & 0x3)

все же.
Это если не разворачивать.
Не вижу никакой разницы, кроме идеологической, между 252 и 0xFC.
Ну о ней и речь. На самом деле, это очень серьезная проблема, когда бинарные циферки пишутся в десятеричной системе.
И вообще, надо
$b = $src[$i];
$str = ($str & 0xFCFCFCFC) | ($b & 0x03) | (($b & 0x0C) << 6) | (($b & 0x30) << 12) | (($b & 0xC0) << 18);
Как заметил ниже vk2, ещё более правильно было бы записывать 0b11111100 )
Да, точно. Мой любимый язык так не умеет. =(
UFO just landed and posted this here
UFO just landed and posted this here
Я тут не так давно видел на джаве такое, специфика была еще в том, что результирующий код(а именно принтф или что-там) еще и регулярно падал с ошибкой нехватки памяти без видимых причин, до сих пор гадаю, по чему.
Рассматривать отличия работы метода «Arr copy», и push, если мне не изменяет память в логике работы операторов, то в приближении будет происходить следующее:
1) при @arr = (@arr, $str); происходит создание массива содержащего в себе все элементы @arr и элемент $str. После чего копирование в массив @arr.
2) При push @arr, $str; будет происходить увеличение памяти выделенной под массив @arr (если это необходимо), после чего добавление нового элемента $str.
Невозможно закрыть программу, не выбрав файл
Да, есть пока такой недостаток…
В следующей сборке попробую тругой принцип работы с пользователем
Однако, Perl не предоставляет возможности работать с файлом как с последовательностью битов, данные считываются минимум побайтово.

perldoc.perl.org/functions/vec.html
Да, неверная формулировка.
Функцию vec() рассматривал при разработке, но так и не смог применить в данной задаче
$NUM_OF_LSB = 2;
for my $bit ( 0..$#bits ) {
	my $bit_index = ( $bit >> $NUM_OF_LSB - 1 << 3 ) + $bit % $NUM_OF_LSB;
	vec( $str, $bit_index, 1 ) = $bits[$bit]
}
Средний исходник на perl — сам по себе пример стеганографии.
Если это школота — то я спокоен.
Автор, молодец!
Если это не ирония, то спасибо.)
Нет, не ирония. Серьезно.
На второй картинке невооружённым глазом заметны частые вертикальные полосы. По-моему, стеганография не получилась. Ведь принцип стеганографии — не только спрятать данные в других данных, но спрятать так, чтобы невозможно было определить сам факт упрятывания.
странно, ни я ни все люди кого я просил — полос не видели… можно скрин?
отвечу не раньше вечера субботы, заранее извиняюсь.
Попробуйте уменьшить яркость монитора.

Или вот ваша картинка после простого уменьшения освещённости на 25 пунктов в Гимпе:
image
хм, уменьшив яркость не увидел ничего, но уменьшив яркость в -100 — -150 в ШФ становится видно, да. в принципе, белый, да и любой монотонный фон действительно не самое удачный объект.

вот (2.4Мб) немонотонный объект, на нем сколько не извращался — следов «вмешательства не заметил».
файл «забит» полностью.
Наверное, у меня дисплей такой специфический, для криптоаналитиков. Я тоже ни на одном другом полос не увидел.
Sign up to leave a comment.

Articles