「こんにちは」から「rO0ABXQAD+OBk+OCk+OBq+OBoeOBrw==」
と変換されるための法則は何なのかを知りたいです。
質問が長すぎるといわれたので、以下に記載しました。
みなさま、よろしくお願いいたします。
http://www.zuikoji.com/hatena/q.txt
UTF-8で書かれた「こんにちは」という文字列をjavaでserializeし、base64でエンコードするとそうなります。
ここのコードを以下のように変更したコードで、base64でデコードする前のバイト列がresult.txtに保存されます。
import java.io.*; class SerializeTest { public static void main(String[] args) throws IOException { FileOutputStream outFile = new FileOutputStream("result.txt"); ObjectOutput out = new ObjectOutputStream(outFile); out.writeObject("こんにちは"); out.flush(); out.close(); outFile.close(); } }
上記ページに手順も含めてすべて書いてあります。
手順自体はシンプルなもので、逆変換も可能です。
Base64変換の手順を以下に挙げる。
1. 元データを6bitずつに分割。(6bitに満たない分は0を追加して6bitにする)
2. 各6bitの値を変換表を使って4文字ずつ変換。(4文字に満たない分は = 記号を追加して4文字にする)
変換方法はシンプルなものなので、そこで間違う可能性は低いと思います。
「こんにちは」の前に付いているデータをBASE64だという前提で元にもどしてみましたが、文字列本文とは別の何かの付加情報っぽいですよね。
1010(A) 1100(C) 1110(E) 1101(D) 0000(0) 0000(0) 0000(0) 0101(5) 0111(7) 0100(4) 0000(0) 0000(0) 0000(0) 1111(F)
※括弧内は試しに16進で読んでみた場合の値
---
ところで「あるサイト」というのは、どこでしょう?
それが解決のヒントにならないですかね?
UTF-8で書かれた「こんにちは」という文字列をjavaでserializeし、base64でエンコードするとそうなります。
ここのコードを以下のように変更したコードで、base64でデコードする前のバイト列がresult.txtに保存されます。
import java.io.*; class SerializeTest { public static void main(String[] args) throws IOException { FileOutputStream outFile = new FileOutputStream("result.txt"); ObjectOutput out = new ObjectOutputStream(outFile); out.writeObject("こんにちは"); out.flush(); out.close(); outFile.close(); } }
ありがとうございます。
http://www.zuikoji.com/hatena/q.txt
質問の続きがこちらに書いてあるのですが、
「Base64」ということは判明しています。
その後、具体的な変換の部分でつまずいています。
「rO0ABXQAD+OBk+OCk+OBq+OBoeOBrw==」をデコードすると、「(文字化けの文字列)こんにちは」となってしまいました。
なぜ文字化けするのか、変換方法が間違っているのであればどのような可能性があるのかも知りたいです。