Conversa fiada
Ainda existe uma biblioteca portada para vários dialetos do Smalltalk (Visualworks, Gemstone Squeak / Pharo, ...) chamado Xtreams que tornam essa tarefa mais do que fácil.
FileStream seria tão simples como 'foo' asFilename reading
e 'bar' asFilename writing
por exemplo, em VisualWorks, mas são dialeto específico.
Por essa razão, demonstro o algoritmo com fluxos internos neutros de dialeto.
Uma boa idéia seria processar cada código de byte em ordem crescente:
| 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
Obviamente, também é possível processar em ordem aleatória, mas receio que isso torne o código um pouco compacto demais:
| 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
EDITAR
Ah, estúpido, eu não vi a solução 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