勉強会の成果物です。
お題は以下の Q6 です。
【問題のみ】第25回もう4年もやってんのかシェル芸勉強会 – 上田ブログ
Q6.日本語のメッセージから作った次の文字列を復元してください。
$ cat crypt
b730a730eb30b8820a00
ヒントになるのは末尾の 0a00
です。
0a
は ASCII における改行コードなので文字列終端と予測できます。
また、改行コードに続き 00
があるので、おそらく 2byte の LittleEndian であることが想像できます。
ASCII 互換で LittleEndian な文字コードといえば Unicode です。
エンコード方式は UTF-8, UTF-16, もしくは UTF-32 辺りがメジャーですが、 2byte なので UTF-16LE であることが想像できます。
というわけでハイ、ドーン
Q6
"b730a730eb30b8820a00" `
| % { for($i=0; $i -lt $_.Length; $i+=2) { $_.SubString($i, 2) } } `
| % { [byte][Convert]::ToInt32($_, 16) } `
| % { $b = New-Object Collections.ArrayList } `
{ $b.Add($_) > $null } `
{ [Text.Encoding]::Unicode.GetString($b) }
一番苦労したのは文字列を 2 文字ずつに SubString するところでした。
sed 's/../& /g'
とか grep -o .. | xargs
とか頭にあると難しい。
せっかく作ったのでこれも。
Q2次のような出力を作ってください。
ひらけ!ポンキッキ
らけ!ポンキッキひ
け!ポンキッキひら
!ポンキッキひらけ
ポンキッキひらけ!
ンキッキひらけ!ポ
キッキひらけ!ポン
ッキひらけ!ポンキ
キひらけ!ポンキッ
一度シェル芸勉強会で作ったことがあったのであっさりでした。
"ひらけ!ポンキッキ" `
| % { $a=$_;1..$_.Length | %{$a+$a} } `
| % {$i=0}{ $_.Substring($i,($_.Length/2));$i++ }