- PR -

固定長バイナリデータの作成

投稿者投稿内容
YUT1018
会議室デビュー日: 2002/12/11
投稿数: 5
投稿日時: 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/12
投稿数: 39
お住まい・勤務地: 東京都
投稿日時: 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/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-11-18 23:57
文字列をバイトで考えるのはやめましょう。
文字コード次第では、半角英数字でも2バイトにもなりうるからです。
ですので、文字コードが明らかであるケース以外は
「バイト」と考えるのではなく「文字数」という概念で考えてください。

ちなみに固定長の文字データを作成するのであれば
単純に各項目の文字数を見て、5に満たない分ループで
スペースを後ろに追加した値を最終的に結合するだけですね。

これはJavaだから実装方法がわからないのですか?
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-11-19 01:50
参考
java sprintf
で検索すると関連が色々出ます。
C 言語スタイルのフォーマット Formatter
http://www5.airnet.ne.jp/sakuraba/java/laboratory/J2SE1.5/MiscAPI/CStyleFormat/printf.html
YUT1018
会議室デビュー日: 2002/12/11
投稿数: 5
投稿日時: 2004-11-19 13:21
影フリーさん、かつのりさん、MMXさん
ご返答ありがとうございます。

かつのりさん:
>これはJavaだから実装方法がわからないのですか?

そのとおりです!
C言語の経験はあるのですが、Javaでどう書くのかが分かりませんでした。
MMXさんのご紹介のようなCのprintf系みたく簡単にフォーマットできるのか?
はたまた、memcpyのようなことができるのか?という観点からJavaAPIリファレンス
を眺めていたら、益々何をどうすればいいのか分からなくなってきた次第です。
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-11-19 13:33
ByteBuffer も参照
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=16517&forum=12
しかし、Javaで書かれているが 中身は C とか COBOL な物には
タッチしたくないです。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-19 13:34
そもそも「バイナリデータ」とはどのようなものを指していますか?
Java文字列を特定の文字コードに変換したもの? それとも特定のフォーマットが決まっている
のですか?

Cで考えている、ということはASCII文字をストリームにしたものを考えているのかな?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-11-19 14:00
printfやscanfみたいなものはJavaにはありません。

正確にいうと、J2SE5.0から可変長引数がサポートされて
printfみたいなメソッドが追加になりました。

またjava.text.MessageFormatクラスでも似たようなことができますが、
この程度ならStringBufferで十分ではないでしょうか。

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