COBOLバッチをJava化する作業の一環で、COBOLバッチで作成していたファイルをJavaでも作成する必要があります。
COBOLでcomp-3(パック10進数)
で定義されている値を、Javaのロジック上ではひとまずBigDecimalで対応していますが、ファイルにはパック10進数として出力する必要があるのですが、方法がわからず困っています。
まずは試行錯誤しているコードを質問を再編集して提示してください。
小数の可能性もあるのですか?
少数の場合もあります。
COMP-3 → BigDecimal が出来ているのであれば、逆のことをすればいいのでは?
もしかしてBCDが分からないって話ですか?
1234 → 0x1234
comp-3を変換してBigDecimal型に代入しているわけではありません。
現状はCOBOLでcomp-3で定義されていた値を、Java上ではBigDecimal型として宣言し、処理を行っているだけです。
2019/07/22 15:32のコメントの確認もお願いします。
聞き方を変えると、「パック10進数として出力する」のどの部分が分からないのでしょうか?
ありがとうございます。
現状、他サイトを参考にBigDecimal型をパック10進数に変換したbyte配列の中身が[50,51,52,53,54,55,56,15]の8バイトで、これをファイル出力すると"[B@17ec9f7"と出力されます。
想定している出力桁数は8バイトなのですが、"[B@17ec9f7"は8バイトを超えているためNGになってしまいます。
参考にしたコードは下記ページのベストアンサーと書かれているものです。
https://codeday.me/jp/qa/20190518/854057.html
それ中身が出力されてないですね。
COMP-3云々じゃなくてファイル書き込みの問題です。
自分のコードを書きましょう。
ありがとうございます。
中身とはbyte配列の中身でしょうか?
そうです。あと、
>>パック10進数に変換したbyte配列の中身が[50,51,52,53,54,55,56,15]の8バイトで
これも変な気がしますね。パック10進数に変換したデータに見えないです。
ついでに、「小数の場合もあります」(誤字修正済)の意味も分からないです。
あなたが想定しているCOMP-3の仕様も書いて下さい。
ありがとうございます。
変換前の数字は12345678です。
想定している仕様は下記のような感じです。
小数無しパターン例
PIC S9(0015) comp-3
小数有りパターン例
PIC S9(0009)V9(04) comp-3
ちなみに私はCOBOLのことは分からないのであしからず。
小数の話はCOBOL側の話ですね。ちょっと調べてみましたが、固定小数点で、(04)が小数部の桁数を表すようで、4桁ずらすだけの話なので問題ないでしょう。
COMP-3に関しては、Wikipediaに書かれている一般的(?)な仕様であれば、12345678 は [0x01, 0x23, 0x45, 0x67, 0x8C] になるかと思います。
ただし、
>>東芝のオフィスコンピュータでは、符号ビットが特殊な値を採るので互換性の問題が発生する。
とWikipediaにも書かれているように、環境によって仕様が異なると思われるので、そこが分からないと変換は出来ないです。さっきのあなたの変換後のデータでは符号部が 0xF になっているようなのですが、これは何か根拠があるのでしょうか?【追記】0xFは「符号なし」という情報を見つけましたが、今回はS9(符号あり)なので間違いですね。
Wikipedia: https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%83%E3%82%AF10%E9%80%B2%E6%95%B0
英語版のほうが情報が多い。符号のバリエーションの記述があります。
https://en.wikipedia.org/wiki/Binary-coded_decimal
JavaのBCD実装にもリンクがあります。
https://github.com/c-rack/bcd4j
PackedEncoder.pack()メソッド。整数のみ、符号なしなので、事前にscale調整などが必要です。
>kanitama111さん
ファイルへ出力はStringでなくbyte配列になります。エンコーディングはEBCDICではありませんか。
>>fuzzballさん
ありがとうございます。
comp-3への変換はソースを修正して対応できました。
ファイル送信先の環境については改めて確認致します。
>>xebmeさん
ありがとうございます。
リンク先を確認させていただきます。
ファイルへの出力ですが、
byte配列で宣言した変数をそのまま設定していますが、Stringで出力されているようです。
バイト出力してるんじゃなく、バイトコードを文字列として出力してるからNGなんだろうな
つかさ
[B@17ec9f7
って
byte[] 型の ハッシュコード「17ec9f7」 (メモリ座標等) だからな