任意のデータを「クソ」でエンコードするエンコーダを作った。
仕様
- 「0」のビットを「ク」、「1」のビットを「ソ」で表す
- 各バイトを順に表す
- 1バイトの中では、MSBからLSBの順に表す
- デコード時、「ク」「ソ」以外の文字は無視する
- デコード時、最後にビットが1バイトに足りず余った場合は、不足しているビットを0で埋める
クソポイント
- 出力が「クソ」
- 理論上は任意のデータを扱えるが、面倒なので今回のアプリでは UTF-8 のテキストのみをサポート
- ビットを適当な文字で表すというのは、多分5000兆番煎じくらい
実装
const encoder = new TextEncoder();
const decoder = new TextDecoder();
function hirabunToKuso(hirabun) {
const kusoData = encoder.encode(hirabun);
let res = "";
for (let i = 0; i < kusoData.length; i++) {
for (let j = 7; j >= 0; j--) {
res += (kusoData[i] >> j) & 1 ? "ソ" : "ク";
}
}
return res;
}
function kusoToHirabun(kuso) {
const kusoData = [];
let byte = 0, bit = 0;
for (let i = 0; i < kuso.length; i++) {
const idx = "クソ".indexOf(kuso.charAt(i));
if (idx >= 0) {
byte |= idx << (7 - bit);
bit++;
if (bit >= 8) {
kusoData.push(byte);
byte = 0;
bit = 0;
}
}
}
if (bit > 0) kusoData.push(byte);
return decoder.decode(new Uint8Array(kusoData));
}
アプリ
プロジェクトページ:mikecat/kuso_encoder: 「クソ」でエンコードするエンコーダ