Болтовня
Есть библиотека, которая портирована на несколько диалектов Smalltalk (Visualworks, Gemstone Squeak / Pharo, ...) с именем Xtreams что делает эту задачу более простой.
FileStream будет таким же простым, как 'foo' asFilename reading
и, 'bar' asFilename writing
например, в Visualworks, но зависит от диалекта.
По этой причине я демонстрирую алгоритм с диалектом нейтральных внутренних потоков вместо этого.
Хорошей идеей может быть обработка каждого байтового кода в порядке возрастания:
| input |
input := 'Hello world' asByteArray reading.
^((ByteArray new writing)
write: ((0 to: 255) inject: ByteArray new reading into: [:outputSoFar :code |
| nextOutput |
nextOutput := ByteArray new writing.
((input += 0; selecting: [:c | c <= code]) ending: code inclusive: true) slicing do: [:subStream |
| positionable |
positionable := subStream positioning.
nextOutput write: (outputSoFar limiting: (positionable ending: code) rest size).
nextOutput write: (positionable += 0; selecting: [:c | c = code])].
nextOutput conclusion reading]);
conclusion) asString
Конечно, также возможно обрабатывать в случайном порядке, но я боюсь, что это делает код слишком компактным:
| input output |
input := 'Hello world' asByteArray reading.
output := ByteArray new writing.
(0 to: 255) asArray shuffled do: [:code |
output += 0.
(input += 0; ending: code inclusive: true) slicing do: [:subStream |
| positionable |
positionable := subStream positioning.
output ++ (positionable += 0; rejecting: [:c | c = code]) rest size.
output write: (positionable += 0; selecting: [:c | c = code])]].
^output conclusion asString
РЕДАКТИРОВАТЬ
Ах, глупый я, я не видел решение log2:
| input output |
input := 'Hello world' asByteArray reading.
(output := ByteArray new writing) write: (input collecting: [:e | 0]).
output := (0 to: 7) asArray shuffled inject: output into: [:outputSoFar :bit |
(ByteArray new writing)
write:
(((input += 0; collecting: [:e | e >> bit bitAnd: 1]) interleaving: outputSoFar conclusion reading)
transforming: [ :in :out | out put: in get << bit + in get]);
yourself].
^output conclusion asString