- - PR -
固定長バイナリデータの作成
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-11-18 22:59
こんにちは。
最近Javaを覚えだした初心者です。 ArrayList等のListインタフェースを持つ配列クラスから1要素づつ取り出し 順に繋げて結果として固定長のバイナリデータを作成します。 例えばArrayListの要素が、"123"、"ABC"、"456789"となっていた場合 1要素づつ取り出しながらStringBufferで連結後、"123ABC456789"と なったところでgetBytes()して、バイナリデータを取得するという 実装を考えたのですが、ここで固定長データの各要素が5byteと決まって いた場合、"123 ABC 456789"のように規定byteに満たない場合は後ろを space埋めする必要があります。 このような場合、皆さんはどうやって実装されるでしょうか? |
|
投稿日時: 2004-11-18 23:44
String[] a = {"123","4","5678", "90123","45","67890","A","Z"};
int totlen = 5; StringBuffer sb = new StringBuffer(); int size = a.length; for(int i=0; i<size; i++){ String str = a[i]; sb.append(str); int tmp = sb.toString().length(); while( tmp<totlen ){ sb.append("#"); tmp++; } totlen += 5; } System.out.println("=>"+sb.toString()); } [ メッセージ編集済み 編集者: 影フリー 編集日時 2004-11-18 23:48 ] |
|
投稿日時: 2004-11-18 23:57
文字列をバイトで考えるのはやめましょう。
文字コード次第では、半角英数字でも2バイトにもなりうるからです。 ですので、文字コードが明らかであるケース以外は 「バイト」と考えるのではなく「文字数」という概念で考えてください。 ちなみに固定長の文字データを作成するのであれば 単純に各項目の文字数を見て、5に満たない分ループで スペースを後ろに追加した値を最終的に結合するだけですね。 これはJavaだから実装方法がわからないのですか? |
|
投稿日時: 2004-11-19 01:50
参考
java sprintf で検索すると関連が色々出ます。 C 言語スタイルのフォーマット Formatter http://www5.airnet.ne.jp/sakuraba/java/laboratory/J2SE1.5/MiscAPI/CStyleFormat/printf.html |
|
投稿日時: 2004-11-19 13:21
影フリーさん、かつのりさん、MMXさん
ご返答ありがとうございます。 かつのりさん: >これはJavaだから実装方法がわからないのですか? そのとおりです! C言語の経験はあるのですが、Javaでどう書くのかが分かりませんでした。 MMXさんのご紹介のようなCのprintf系みたく簡単にフォーマットできるのか? はたまた、memcpyのようなことができるのか?という観点からJavaAPIリファレンス を眺めていたら、益々何をどうすればいいのか分からなくなってきた次第です。 |
|
投稿日時: 2004-11-19 13:33
ByteBuffer も参照
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=16517&forum=12 しかし、Javaで書かれているが 中身は C とか COBOL な物には タッチしたくないです。 |
|
投稿日時: 2004-11-19 13:34
そもそも「バイナリデータ」とはどのようなものを指していますか?
Java文字列を特定の文字コードに変換したもの? それとも特定のフォーマットが決まっている のですか? Cで考えている、ということはASCII文字をストリームにしたものを考えているのかな? |
|
投稿日時: 2004-11-19 14:00
printfやscanfみたいなものはJavaにはありません。
正確にいうと、J2SE5.0から可変長引数がサポートされて printfみたいなメソッドが追加になりました。 またjava.text.MessageFormatクラスでも似たようなことができますが、 この程度ならStringBufferで十分ではないでしょうか。 |