Код выполняет следующие действия: считывает каждый байт со стандартного ввода один за другим (после переключения в необработанный режим, чтобы не происходил перевод). Распаковка получает значение байта только что прочитанного символа, так что чтение «0» превращается в 0x30. Кодировка latin1 выбирается так, чтобы это преобразование было согласованным (например, см. http://www.cs.tut.fi/~jkorpela/latin9.html).
Затем значение, указанное в командной строке с параметром -s, добавляется к этому байту вместе с 512 для имитации операции модуля. Таким образом, -s 0, -s 256 и т. Д. Эквивалентны. Я не уверен, зачем это нужно, потому что я предположил бы, что об этом позаботился следующий пакет, но я думаю, что у них должна была быть веская причина, чтобы положить его туда.
Затем запишите необработанный байт в стандартный ввод.
Вот что происходит, когда вы запускаете его для файла, содержащего символы 012345 (я помещаю данные в раздел DATA ):
E:\Test> byteshift.pl -s 1 | xxd
0000000: 3132 3334 3536 0b 123456.
Значение каждого байта увеличивается на единицу.
E:\Test> byteshift.pl -s 257 | xxd
0000000: 3132 3334 3536 0b 123456.
Помните, 257% 256 = 1. То есть:
$byte += $opt_s;
$byte %= 256;
эквивалентно одному шагу, используемому в коде.
Намного позже: хорошо, я не знаю C #, но вот что я смог собрать, используя онлайн-документацию. Кто-то, кто знает C #, должен это исправить:
using System;
using System.IO;
class BinaryRW {
static void Main(string[] args) {
BinaryWriter binWriter = new BinaryWriter(
Console.OpenStandardOutput()
);
BinaryReader binReader = new BinaryReader(
Console.OpenStandardInput()
);
int delta;
if ( args.Length < 1
|| ! int.TryParse( args[0], out delta ) )
{
Console.WriteLine(
"Provide a non-negative delta on the command line"
);
}
else {
try {
while ( true ) {
int bin = binReader.ReadByte();
byte bout = (byte) ( ( bin + delta ) % 256 );
binWriter.Write( bout );
}
}
catch(EndOfStreamException) { }
catch(ObjectDisposedException) { }
catch(IOException e) {
Console.WriteLine( e );
}
finally {
binWriter.Close();
binReader.Close();
}
}
}
}
E:\Test> xxd bin
0000000: 3031 3233 3435 0d0a 0d0a 012345....
E:\Test> b 0 < bin | xxd
0000000: 3031 3233 3435 0d0a 0d0a 012345....
E:\Test> b 32 < bin | xxd
0000000: 5051 5253 5455 2d2a 2d2a PQRSTU-*-*
E:\Test> b 257 < bin | xxd
0000000: 3132 3334 3536 0e0b 0e0b 123456....