MACアドレス(16進数)
00:00:00:00:00:01 これが引数で指定される。
String str = args[0];
というものがありまして(String型)、
そのコロン:で分けられた数字部分のみをバイト配列に格納したいのですが、そのうまい方法がわかりません。お助けください。
byte mac_addr[0] = Byte.parseByte("0x".concat(str.substring(0,1)));
なんて事もしてみましたが、NumberForamtExceptionが
表示されます。(コンパイルは出来る。)
うむ、分からない。どこが悪いのだろう???
以上
No.1ベストアンサー
- 回答日時:
>コロン:で分けられた数字部分のみをバイト配列に格納したいのですが、そのうまい方法がわかりません。
java.util.StringTokenizer を使いましょう。
例)StringTokenizer st=new StringTokenizer(args[0],":");
これで、st.nextToken() を呼び出せば「コロンで分けられた部分」の文字列を抽出出来ます。
例)
StringTokeinzer st=new StringTokeizer(args[0],":");
String[] s=new String[st.countTokens()];
for(int i=0; i<s.length; i++){
s[i]=st.nextToken();
}
>byte mac_addr[0] = Byte.parseByte("0x".concat(str.substring(0,1))); なんて事もしてみました
public static byte parseByte(String s)
は、文字列表現を基数10として扱うものです。
この場合は、もう1つの parseByte() 。。。
public static byte parseByte(String s, int radix)
を使ってみてください。radix は基数の指定です。
例)mac_addr[0]=Byte.parseByte(str, 16);
これで、基数16として数値の文字列表現(str)を byte型に変換します。
それと、Java の byte は 127 ~ -128 の値しか取りません。ご注意を。
早速の回答ありがとうございます。
早速試してみました。
うまく文字列を引き出すことには成功いたし、大変感謝いたします。今まで数十行でやっていたことがたった数行で収まりました。気持ちいいですね。
ところで、str = "a5"で
>例)mac_addr[0]=Byte.parseByte(str, 16);
の時、
>それと、Java の byte は 127 ~ -128 の値しか取りません。ご注意を。
ということで、byteに格納するのは不可能となると考えました。(間違っているかな?)
こうするとうまくMACアドレスを指定できるのですが
mac_addr[0]=(byte)(0xa5);
String型の"a5"を0xa5に指定できる方法はありませんでしょうか?
以上
No.6
- 回答日時:
>もっとスマートな方法があれは私も知りたい。
1.4 以上で可なら#5さんのコードが可読性も高いし良さそうな気がします。。。
StringTokenizer を使うか、または substring() などで数字部分のみを抽出してから parseInt() 後に byte にキャストする。。。ってのも、まぁ大まかには同じことなんでしょうけどね・w
ちょっと目先をかえるとしたら。。。
StringBuffer sb=new StringBuffer(args[0]);
int index;
while((index=sb.indexOf(":"))!=-1){
sb.deleteCharAt(index);
}
long lg=Long.parseLong(sb.toString(),16);
byte[] b=new byte[6];
for(int i=0 ; i<b.lenght ; i++){
b[i]=(byte)(lg>>(40-i*8));
}
って感じで、一旦区切り文字を排除してから一括で long にしてしまって、後はシフトを使って byte 配列にぶち込むってのもありかな?(それにしても可読性悪過ぎ・w)
ん、なんか話が脱線してしまいましたね。。。申し訳ない(汗
No.5
- 回答日時:
String[] parts = "12:23:45:67:FF:AB".split(":");
byte[] macAddress = new byte[parts.length];
for(int i = 0 ; i < parts.length ; i++){
macAddress[i] = (byte)Integer.parseInt(parts[i], 16);
System.out.println(macAddress[i]);
}
でどうですか?
j2sdk1.4必須ですけど・・・。
No.4
- 回答日時:
ifHex2Byteは
これでいいみたい
public static int ifHex2Byte(String sHex){
int iAns=0;
byte bHex[] = sHex.getBytes();
iAns = Character.digit(sHex.charAt(0),16);
iAns *= 16;
iAns += Character.digit(sHex.charAt(1),16);
return iAns;
}
ありがとうございます。
うまくいきました。
Dos窓にもキチンと格納されたMACアドレスを表示することができました。ただWindowsからフレームを送信しても
MACアドレスは指定したものにならないようです。
Jpcapドキュメント
http://www.goto.info.waseda.ac.jp/~fujii/jpcap/d …
もうしばらく格闘してみます。
以上
No.3
- 回答日時:
もっとスマートな方法があれは
私も知りたい。
import java.util.StringTokenizer;
import java.lang.Character;
public class Test {
public static void main(String[] args) {
String sMac = "12:23:45:67:FF:AB";
byte[] bMac = ufStr2Mac(sMac);
for (int j=0; j<bMac.length; j++){
System.out.println(Integer.toHexString(bMac[j]).toUpperCase());
}
}
public static byte[] ufStr2Mac(String sMac){
byte[] bMac =new byte[6];
StringTokenizer oStringTokenizer = new StringTokenizer(sMac,":");
String sHex;
for(int j=0; j<6; j++){
sHex = oStringTokenizer.nextToken();
bMac[j] = (byte)ifHex2Byte(sHex);
}
return bMac;
}
public static int ifHex2Byte(String sHex){
int iAns=0;
byte bHex[] = sHex.getBytes();
Character cTmp = new Character(sHex.charAt(0));
iAns = cTmp.digit(sHex.charAt(0),16);
iAns *= 16;
iAns += cTmp.digit(sHex.charAt(1),16);
return iAns;
}
}
No.2
- 回答日時:
>こうするとうまくMACアドレスを指定できるのですが mac_addr[0]=(byte)(0xa5);
mac_addr[0] に本当に望む通りの値が格納されてますか?
System.out.println() を使って確認してみて下さい。
ヒントは「ナローキャストは例外を発生させず、値が失われるだけ」
>>それと、Java の byte は 127 ~ -128 の値しか取りません。ご注意を。
>ということで、byteに格納するのは不可能となると考えました。
単に 127 までの値しか格納できないという事です。
仮にですけど、127 までの値しか使わないというのならば byte であってもかまわないでしょう(有り得るかどうかは別として・笑)
他にも、byte 配列に代入する際に 128 を引き、取り出す際に 128 を足すというルールに沿えるなら byte で済ませる事は可能でしょう。
けれど、特に理由が無ければ int 型にしておいた方が良いのではないですかね?(状況が解らず適当な発言ですが)
>特に理由が無ければ
詳しい状況をご説明していないのにも関わらず、回答を頂きありがとうございます。
byteにしたい理由は、Jpcapというフレーム生成キャプチャAPIを公開されている方の指定です。
http://www.goto.info.waseda.ac.jp/~fujii/jpcap/d …
ここのEthernetPacketクラスのdst_macへコマンドプロンプトから受け取った引数を格納する方法がなかなかうまいこと出来ないのです。(初めからこういったほうが話は早かったかもしれませんね。)
以上
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaBeansの配列の値取得方法に...
-
[Ljava.lang.Stringってなんですか
-
javaで大容量テキストファイル...
-
javaでの文字列からの数字抽出
-
java StringとString[]の違い
-
Javaで文字と数字が混ざったも...
-
無名配列の作成方法について質問
-
この警告はどうすれば?
-
配列で、値の入っている要素数...
-
Javaで文字を漢字であるか否か...
-
C#で動的配列Listの中身をListB...
-
C言語でunsigned char配列を連...
-
セッションを使ったint型の値の...
-
ランダムでのboolean値の与え方
-
String型をbyte型へ
-
配列について
-
Struts:可変個数のテキストボ...
-
ArrayListからBean配列に値をセ...
-
同じ文字を探しカウントしたい
-
C言語のポインターに関する警告
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Javaで文字と数字が混ざったも...
-
[Ljava.lang.Stringってなんですか
-
main(String[] args) の args...
-
この警告はどうすれば?
-
【C#】ハッシュテーブル(連想...
-
javamailで複数人にメールを送...
-
jspでの二次元配列
-
配列をセッションに割り当てた後で
-
同じ配列またはクラスを、2回...
-
java
-
Javaで文字を漢字であるか否か...
-
csvファイルを2次元配列に格納
-
配列の中に複数存在する数がい...
-
配列で、値の入っている要素数...
-
JavaのBase64デコードで正しく...
-
C言語でunsigned char配列を連...
-
C#で動的配列Listの中身をListB...
-
【Ajax通信&Java】配列の受け取...
-
javaについて
-
javaでEUC-JP文字列→UTF-8への変換
おすすめ情報