String または byte[]をデバッグ目的で16進に変換するには、1文字ずつ処理すればいいのですが、ヘキサ表示なんてだれもが行うものですからすでにライブラリ化されていないでしょうか?

sun.misc.HexDumpEncoder クラスは見つけたのですが、このほかに16進変換に使えるクラスはありませんでしょうか。(apache-commonsなら安心して使えるのでうれしいです)

HexDumpEncoder encoder = new HexDumpEncoder();
String encoded = encoder.encode("abcde".getBytes());
System.out.println(encoded);
出力
0000: 61 62 63 64 65

希望としては 0000:  は不要なので
61 62 63 64 65
6162636465
0x6162636465
などに変換できると助かります。

A 回答 (1件)

IntegerクラスのtoHexString()メソッドでは、だめですか。


(私は、結果の気に入らない部分は適当に加工します。)

この回答への補足

toHexStringを使う場合次のような感じになると思うのですが、毎度実装するのが面倒なのと、符号の考慮を忘れがちなので、できればライブラリを使いたいと思っています。

  static String toHexString(String str, String encode) {
    byte[] bytes = str.getBytes(encode);
    StringBuilder sb = new StringBuilder();
    for (byte b : bytes) {
      int i = b;
      if(i<0) i+=256; // 符号の考慮
      String hex = Integer.toHexString(i).toUpperCase();
      sb.append(hex);
      sb.append(' ');
    }
    return sb.toString();
  }

補足日時:2008/01/27 00:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q8進数から16進数への変換

8進数から16進数、また、16進数から8進数に
計算過程でほかの進数に変換することなく直接変換できますか?

Aベストアンサー

例:
8進の 324 を16進に。
32 と 4に分ける
32 を 2で割る → 15 あまり 0
あまり0なので、4はそのまま。
15を1 5 に分ける。
1を2で割る→ 0 あまり 1
あまり1なので、 5に+8する
0になったので終了。 答えは D4

等というように、ビットシフトと等価な計算はできます。
ただ、これを「他の進数に変換していない」と言っていいか微妙です。

それに、2進数にして区切りを変更する方が楽なのではないでしょうか。
324 → 011 010 100 → 0 1101 0100 → D4

QString(byte[] bytes, int offset, int length)の文字コードは?

String(byte[] bytes, int offset, int length)は、バイト配列(8bitずつのまとまり)を、文字列型に直す、というものだと思うのですが文字コードは何にしたがって直すのでしょうか?

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html

Aベストアンサー

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#String%28byte[],%20int,%20int%29

>プラットフォームのデフォルト文字セットを使用して、

日本語WindowsならShift_JISでしょう。他の環境では解りません。

#なので僕は

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#String%28byte[],%20int,%20int,%20java.lang.String%29

で指定するほうが好きです。(コードを読む人に,誤解を与えにくく,異なる環境でも挙動を一致させやすいから移植性も高まると考えるため)

どうしてもデフォルトがほしけりゃ
http://java.sun.com/javase/6/docs/api/java/nio/charset/Charset.html#defaultCharset%28%29
があるわけですし

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#String%28byte[],%20int,%20int%29

>プラットフォームのデフォルト文字セットを使用して、

日本語WindowsならShift_JISでしょう。他の環境では解りません。

#なので僕は

http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#String%28byte[],%20int,%20int,%20java.lang.String%29

で指定するほうが好きです。(コードを読む人に,誤解を与えにくく,異なる環境でも挙動を一致させやすいか...続きを読む

Q2進数から16進数への変換、あるいはその逆について

はじめまして。
高校の情報の授業で「2進数・10進数・16進数」を勉強しています。
どうしても2進数から16進数への変換、あるいは、16進数から2進数への変換の方法がわかりません・・・

初心者でも分かりやすい解説をお願いします。

Aベストアンサー

2進数の各桁を、右から4桁毎に区切って、その4桁を右から1,2,4,8という具合に割り当てます。
その4桁を、16進数の1文字に対応させて、そのまま置き換えるだけです。
これを、2進数の4桁毎に、繰り返せば複数桁の16進数になります。

逆に、16進数を2進数にする場合は、16進数を1桁ずつに分解し、それぞれを2進数4桁に置き換えて、全体を繋げれば完成です。

2進数:16進数:中身
0000=0=0そのまま
0001=1=1そのまま
0010=2=2そのまま
0011=3=2+1
0100=4=4そのまま
0101=5=4+1
0110=6=4+2
0111=7=4+2+1
1000=8=8そのまま
1001=9=8+1
1010=10=8+2
1011=11=8+2+1
1100=12=8+4
1101=13=8+4+1
1110=14=8+4+2
1111=15=8+4+2+1

Qbyte[]→String変換後の文字列が違うのはなぜ?

byte[]→String変換の処理を行っていたのですが、
使うメソッド(コンストラクタ)によって結果が違ってきます。なぜだかよくわからないのですが、どなたかご説明していただけないでしょうか。

byte[]bt;
Stringstr1 = "12345", str2;

bt = str1.getBytes();

(1)str2 = new String(bt);
(2)str2 = bt.toString();

(1)の方法と(2)の方法では答えが違ってきます。(1)では"12345"でしたが、(2)ではなんだか記号などまざったぐちゃぐちゃな文字列でした。

よろしくお願いいたします。

Aベストアンサー

(1)が配列の内容を基に文字列を生成しているのに対し、
(2)は配列のインスタンス(内容ではない)を示す文字列を引き出しています。
全く別のものです。

Q8桁文字列を16進数バイト配列に変換

お世話になります。
VB2005を使用しています。
温調器から温度データを引っ張るプログラムを作成しています。
8桁の文字列を16進数バイト配列に変換したいのですが、GetBytesでは10進数バイト配列に変換されてしまいます。
8桁の文字列又は10進数バイト配列を16進数バイト配列に変換する方法はないでしょうか?
文字列を1文字ずつ16進数に変換して配列に組み込んでいくしかないのでしょうか?
よろしくお願い致します。

Aベストアンサー

その温度計のメーカーには問い合わせしたのでしょうか
サンプルとかはないのですか

たとえば "GET" といった文字列を送りたい場合
どのように変換したものを送ればいいのかなど

"GET" を "474554"といった文字列に変換して送信なのか
『474554』といった文字列が必要なら

dim bld as new System.Text.StringBuilder
dim ss as string
for each _byte as Byte in AryByte
  bld.Append( String.Format( "{0:X2}", _byte ) )
next
ss = build.ToString
SerialPort1.Write( ss, 0, ss.length )
といった具合でよさそうですが

メーカのWebページなどにその機器の使い方のサンプルがあるなら
明示してみるといいかもしれませんよ

Q「String arr[]」 と「String[] arr」の違いは?

「String[] arr」の方が良い理由も教えてください。

Aベストアンサー

String arr[]
はStringクラスの変数がいっぱい
という解釈ね。

String[] arr
はString[] の変数arrを意味するわ。

内部的な処理は同じだけど見た目が違うの。
Javaでは配列も一つのオブジェクトとして扱っているため
String[]クラスのインスタンスであるarrという表現の方がJavaっぽい
という回答になるかな。

蛇足だけど
表現を統一しておけば何かと便利よね。

Q16進数を10進数に簡単に変換する関数は?

16進数を10進数に簡単に変換する関数は何かありますか?
もしご存知でしたら教えていただけないでしょうか?

例えば、3BDF8という16進数を10進数に変換したいと思っています。

Aベストアンサー

C言語のプログラム内では、保持している数値にn進数という概念はなく
文字列化するときに初めて考えるものです。

int n; // <- このnは何進数でもない

ご質問を以下のように解釈してサンプルを書いてみました。

例えば、3BDF8という16進数(の文字列)を10進数(の文字列)に変換したいと思っています。


$ cat test.c
#include <stdio.h>

int main(int argc, char *argv[])
{
int num;
sscanf(argv[1], "%x", &num);
printf("%d\n", num);
}

$ ./a.out 3BDF8
245240

いかがでしょうか。

QJAVAの質問です。 ( String args[] )それとも(String[] args) ?

MAINのこの引数ですが、
どちらが正しいのでしょうか?

また、そもそも この[]はなぜ必要なのでしょうか?
配列を意味していますか?

Aベストアンサー

mainに関してだけは (String[] args) が正しい・・・と思いましたが
( String args[] ) でコンパイルも実行も両方通ったのでどちらも正しいようです

配列を意味しています
例えば
String[] hai={"どちらも","正しい","とは","知らなかった"};
String hai[]={"どちらも","正しい","とは","知らなかった"};
ではどちらも配列を宣言した上でhai[0],hai[1],hai[2],hai[3]に文字列を代入しています。

String[] hai=new String[3];
String hai[]=new String[3];
で配列領域を確保してから
hai[0]="どちらも正しい";
のように代入してゆく方法もあります


main(String[] args) のString配列argsの中にはコマンドプロンプトでの実行時にプログラム名の後ろにスペースで分けて入力した文字列が[0]から順に代入されます

実行時に例えばHello.javaを実行するため

java Hello と入力して実行した時はargsには何も入っていませんが

java Hello nyuuryoku shita と入力して実行した時には

Hello.javaが実行された時mainメソッドの中で
args[0]には nyuuryoku が
args[1]には shita が代入された状態になっています

実行と同時に入力した値をプログラム内で使いたい時に用いる変数です

mainに関してだけは (String[] args) が正しい・・・と思いましたが
( String args[] ) でコンパイルも実行も両方通ったのでどちらも正しいようです

配列を意味しています
例えば
String[] hai={"どちらも","正しい","とは","知らなかった"};
String hai[]={"どちらも","正しい","とは","知らなかった"};
ではどちらも配列を宣言した上でhai[0],hai[1],hai[2],hai[3]に文字列を代入しています。

String[] hai=new String[3];
String hai[]=new String[3];
で配列領域を確保してから
hai[0]="どちらも正しい";...続きを読む

Q16進数を10進数に変換する方法...

お初にお目にかかります(^^)
簡潔に質問しますm(_ _)m

バージョン:MS-Visual Basic6.0
質問内容:
16進数を10進数に変換する方法がわかりません。
Hex(Text1.Text) や Oct(Text1.Text) のような方法で
16進数・8進数に変換できるんですが…
10進数に変換する方法がわかりません。

P.S できれば、16進数→10進数、16進数や10進数→2進数
…に、変換する方法も、よろしければ教えてくださいませ
m(_ _)m

Aベストアンサー

16進数→10進数は

Dim StrHex As String
Dim intVal As Integer
StrHex = "1A"
intVal = Val("&H" & StrHex)

で出来ます。


申し訳ありませんが2進数への変換はよく分かりません。

QStringの文字列をString[]配列に変換したい

お世話になります♪

たとえばこういうStringの文字列があるとします。
String s = "私は Javaを 勉強 しています。";
これを下記のようなイメージでString[]配列に変換したいのですが、
{"私は","Javaを","勉強","しています。"};

何かいい方法はないでしょうか?
ヒントをください!

よろしくお願いします。

Aベストアンサー

java.util.StringTokenizerで区切り文字を半角スペースで使用して、
hasMoreTokens()をwhileで回しながらそのループ中で配列に投入してはどうですか?


人気Q&Aランキング