質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
ASCII

ASCIIは、米国規格協会(ANSI)が制定したコンピューターの情報交換のための文字コードの一つ。アルファベットや数字などを1文字当たり7ビットで表します。英数字を表示する文字コードの中で最も高い互換性を持ち、多くの通信機器に利用されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

3回答

4916閲覧

Javaで16進数文字列を可視文字列に変換する際、文字コードを指定したい

wwwww

総合スコア41

ASCII

ASCIIは、米国規格協会(ANSI)が制定したコンピューターの情報交換のための文字コードの一つ。アルファベットや数字などを1文字当たり7ビットで表します。英数字を表示する文字コードの中で最も高い互換性を持ち、多くの通信機器に利用されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

1クリップ

投稿2020/07/22 11:38

編集2020/07/27 04:42

■要約

Javaで16進数をASCII文字列へ変換する目的で、コード(※詳細下記)実行すると、文字コードがUTF-8で変換が掛かります(Shift-jisでの変換が希望です)。

※16進数(Shift-jis:"82A082A282A482A682A8")
⇒ASCII文字列("あいうえお")

■前提

 ●win10
●Eclipse:2019-06 (4.12.0)
※文字コードの設定について、こちらを参照して「Shift-JIS」に変更済です。
★実行環境
上記Eclipse上で実行、同コンソール上にテスト出力しています。

 ●『あいうえお』の16進数:
・UTF-8 : 3042304430463048304a
・Shift-JIS : 82A082A282A482A682A8

■不明点

 こちらのサイトを参考に、以下コードを実行すると、

  //①.変更したい対象の16進数を指定 String hexStr="82A082A282A482A682A8";   //②.最終outputを入れるStringBuilder型を定義 StringBuilder output = new StringBuilder("");   //③.①の16進数を4文字ずつ切り出して、文字列として②変数に格納 for (int i = 0; i < hexStr.length(); i += 4) { String str = hexStr.substring(i, i + 4); output.append((char) Integer.parseInt(str, 16)); }   //④.結果出力 System.out.println(output.toString());

以下が出力されます。

???芦? ```※先頭行で指定する16進数を「__3042304430463048304a__」とすると、『__あいうえお__』が出力されます。 ### ■試したこと(がいずれでも解決せず…) 文字コードを指定する目的で以下コードに変更の上実施したのですが、 結果は変わりませんでした。  ※上記コードに対して、「>」行が、追記行。 ```ここに言語を入力 String hexStr="82A082A282A482A682A8"; StringBuilder output = new StringBuilder(""); for (int i = 0; i < hexStr.length(); i += 4) { String tmp_str = hexStr.substring(i, i + 4); > //文字コードを指定する目的で、文字列データをbyte型経由。 > byte[] tmp_byte = new String(tmp_str).getBytes("SJIS"); > String str = new String(tmp_byte); output.append((char) Integer.parseInt(str, 16)); } System.out.println(output.toString());

解決方法について、ご存じの方がいらっしゃりましたら、
ご教示のほど、何卒よろしくお願いいたします。
不明点等ありましたら、その旨ご教示くださいますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/07/22 12:16

実行している環境をなるべく詳しく明示してください。Windowsのコマンドプロンプト、PowerShell上であるとか、Linuxのターミナル上であるとか、です。コメント欄ではなく、質問文中に追記、修正でお願いします。
maisumakun

2020/07/22 12:28

あの、ASCIIは漢字や仮名を含まない文字コードなのですが… もう少し用語を正しくしていただけないでしょうか?
wwwww

2020/07/27 04:43

@dodox86さん 「★実行環境」として本文に追記いたしました。 @maisumakunさん に表題・本文ともに、「16進数文字列を可視文字列に変換」に修正いたしました。 ご指摘ありがとうございます。今後注意いたします。
guest

回答3

0

ベストアンサー

Java

1class Test { 2 public static void main(String[] args) throws Exception { 3 String s = "82A082A282A482A682A8"; 4 int n = s.length() / 2; 5 byte[] b = new byte[n]; 6 for (int i = 0, j = 0; i < n; j += 2) 7 b[i++] = (byte)Integer.parseInt(s.substring(j, j + 2), 16); 8 s = new String(b, "SJIS"); 9 System.out.println(s); 10 } 11}

投稿2020/07/23 03:13

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwwww

2020/07/27 05:06

ありがとうございます! 希望する変換が問題なく実行できますこと、確認できました! ご記載のように、新規Stringの変数作成時に文字コード指定をすべきでした…。 また、byte変換における書き方について、そのようなやり方もあるのか、と勉強になります。しっかり理解しておきたいと思います!
wwwww

2020/07/27 05:09

解法・修正依頼について、いくつかいただきまして、誠にありがとうございました! 独断で恐縮ですが、具体例頂いたうえで、コード量少なく頂いたkazuma-s様にベストアンサーをつけさせていただきました。 皆様、お手間頂戴し、ありがとうございましたm(_ _)m
guest

0

java

1import java.nio.ByteBuffer; 2import java.nio.charset.Charset; 3 4class Main { 5 public static void main(String[] args) { 6 //①.変更したい対象の16進数を指定 7 String hexStr="82A082A282A482A682A8"; 8 //②.ShiftJISとしてデコードできるByteBuffer型を定義 9 int hexBufLen = hexStr.length() / 2; 10 ByteBuffer hexBuf = ByteBuffer.allocate(hexBufLen); 11 hexBuf.clear(); 12 //③.①の16進数2文字ずつ切り出して、byte に変換し②変数に格納 13 for (int i = 0; i < hexStr.length(); i += 2) { 14 String byteStr = hexStr.substring(i, i + 2); 15 byte aByte = (byte) (Integer.parseInt(byteStr, 16) & 0xFF); 16 hexBuf.put(aByte); 17 } 18 hexBuf.flip(); //Bufferの読み込み位置をはじめにもどる 19 20 //④.ShiftJISをデコードできるCharset型を定義 21 Charset shiftJis = Charset.forName("Shift_JIS"); 22 //⑤.最終結果に②変数を④変数でデコード 23 String output = shiftJis.decode(hexBuf).toString(); 24 25 //④.結果出力 26 System.out.println(output); 27 } 28}

投稿2020/07/22 13:31

YufanLou

総合スコア464

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwwww

2020/07/27 05:00

ありがとうございます! 希望する変換が問題なく実行できますこと、確認できました! また、ByteBuffer、decodeなどは初見でしたため、大変勉強になります。
guest

0

その16進数をバイト配列に変換し、Stringのコンストラクタで文字列に変換します

String (Java Platform SE 8 )

String(byte[] bytes, Charset charset)

指定された文字セットを使用して、指定されたバイト配列を復号化することにより、新しいStringを構築します。

投稿2020/07/22 13:27

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwwww

2020/07/27 05:02

ありがとうございます! よくよく考えると、byteに文字コード指定するのではなく、byteをStringにする際に文字コードを設定(した新規Stringの変数作成)すべきでした。 ご教示ページについて、理解に努めたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問