- PR -

16進バイナリから文字列への変換処理

1
投稿者投稿内容
siggy
常連さん
会議室デビュー日: 2002/08/14
投稿数: 23
投稿日時: 2004-06-09 21:41
stringという文字列を16進バイナリに変換した文字列
737472696E67
があるのですが、これをstringという文字列に戻したいのですが
どうやればいいのでしょうか?
ご教示願います。
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-06-09 22:25
引用:

stringという文字列を16進バイナリに変換した文字列
737472696E67があるのですが、


何をどうやってその文字列になったのでしょうか?

引用:

これをstringという文字列に戻したいのですが
どうやればいいのでしょうか?


ひょっとして暗号解読のしかたが知りたいのでしょうか?
ぼんじぃ
ベテラン
会議室デビュー日: 2004/05/21
投稿数: 70
投稿日時: 2004-06-09 22:58
たぶんコード文字列的にASCIIコードだと思いますが、
Javaでは通常ユニコードを使用するのでそのコード文字列
から直接文字列にすることはできませんので
1.コード文字列(737472696E67)をバイト配列に変換
2.バイト配列から文字列を作成
という手順になると思います。

ちなみに試していないので動作するかは不明です。
悪しからず…
syousuke
会議室デビュー日: 2002/09/27
投稿数: 19
投稿日時: 2004-06-09 23:13
こんな感じで

byte a[] = new byte[6];
a[0] = 0x73;
a[1] = 0x74;
a[2] = 0x72;
a[3] = 0x69;
a[4] = 0x6E;
a[5] = 0x67;
String b = new String(a,"8859_1");

どうでしょう
ぼんじぃ
ベテラン
会議室デビュー日: 2004/05/21
投稿数: 70
投稿日時: 2004-06-09 23:20
一応サンプルで作ってみました
一応ちゃんとASCIIから文字列に復元されました

public class AsciiTest
{
public static void main(String[] args){
String input = null;
byte[] buffer = null;
byte[] bytes = null;
String str = null;

try{
input = args[0];

buffer = new byte[input.length()];
for(int i = 0; i < input.length(); i++){
buffer[i] = Byte.parseByte(Character.toString(input.charAt(i)), 16);
}

bytes = new byte[buffer.length / 2];
for(int i = 0; i < bytes.length; i++){
bytes[i] = (byte)(buffer[2 * i] * 16 + buffer[2 * i + 1]);
}

str = new String(bytes, "US-ASCII");

System.out.println(str);
}catch(Exception e){
e.printStackTrace();
}
}
}
siggy
常連さん
会議室デビュー日: 2002/08/14
投稿数: 23
投稿日時: 2004-06-10 10:26
皆様、ご回答ありがとうございます。

やはり一撃というわけにはいかないですね。
この文字列を送ってきた者に確認すると日本語文字列も
あるようなので、さらに面倒なことになりそうです・・・。
jack_pma
常連さん
会議室デビュー日: 2002/11/15
投稿数: 35
お住まい・勤務地: 埼玉
投稿日時: 2004-06-10 12:05
こんにちは、jack_pmaと申します。

これ、Stringをbyte配列にしてnew Stringで文字列化しているわけですから、日本語が入っても最後にStringにする時のエンコーディングだけ間違えなければ大丈夫じゃないですかね。

ところで、私は横着者なので↓こんな感じに作ってみました。
でも、ぼんじぃさんの例(日本語はどっちも通るでしょう)のが速いかな・・・やってることはほぼ同じですからどっちがいいってものではないですがせっかく書いちゃったのでこれも載せておきます

コード:
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
public class HexToStrConverter {

    public static void main(String[] args) throws Exception{

        StringReader in = new StringReader(args[0]);
        ByteArrayOutputStream out = new ByteArrayOutputStream();

        // 2文字で1バイトなわけなので2文字ずつ読む
        char[] buff = new char[2];

        int read = 0;
        while ((read = in.read(buff)) > 0) {
            out.write(Integer.parseInt(String.valueOf(buff), 16));
        }
        // ここは元文字列のエンコーディングを指定する
        System.out.println(new String(out.toByteArray(), "Shift_JIS"));
    }
}

siggy
常連さん
会議室デビュー日: 2002/08/14
投稿数: 23
投稿日時: 2004-06-10 12:21
jack_pmaさんに指摘されるまで、最後のnew Stringで
文字コードを誤って解釈していました・・・。
コード的にはjack_pmaさんのほうがオブジェクト的で私好みですが
やはりぼんじぃさんの方が速そうで魅力的です。

ちょっと検証してみます。
1

スキルアップ/キャリアアップ(JOB@IT)