質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

Q&A

2回答

6824閲覧

JavaでBigDecimal型をパック10進数としてファイル出力する方法

kanitama111

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

0グッド

1クリップ

投稿2019/07/22 05:06

COBOLバッチをJava化する作業の一環で、COBOLバッチで作成していたファイルをJavaでも作成する必要があります。

COBOLでcomp-3(パック10進数)
で定義されている値を、Javaのロジック上ではひとまずBigDecimalで対応していますが、ファイルにはパック10進数として出力する必要があるのですが、方法がわからず困っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2019/07/22 05:17 編集

まずは試行錯誤しているコードを質問を再編集して提示してください。
swordone

2019/07/22 05:41

小数の可能性もあるのですか?
kanitama111

2019/07/22 05:44

少数の場合もあります。
fuzzball

2019/07/22 06:22

COMP-3 → BigDecimal が出来ているのであれば、逆のことをすればいいのでは?
fuzzball

2019/07/22 06:32

もしかしてBCDが分からないって話ですか? 1234 → 0x1234
kanitama111

2019/07/22 06:35

comp-3を変換してBigDecimal型に代入しているわけではありません。 現状はCOBOLでcomp-3で定義されていた値を、Java上ではBigDecimal型として宣言し、処理を行っているだけです。
fuzzball

2019/07/22 06:47

2019/07/22 15:32のコメントの確認もお願いします。 聞き方を変えると、「パック10進数として出力する」のどの部分が分からないのでしょうか?
kanitama111

2019/07/22 07:38

ありがとうございます。 現状、他サイトを参考にBigDecimal型をパック10進数に変換したbyte配列の中身が[50,51,52,53,54,55,56,15]の8バイトで、これをファイル出力すると"[B@17ec9f7"と出力されます。 想定している出力桁数は8バイトなのですが、"[B@17ec9f7"は8バイトを超えているためNGになってしまいます。
fuzzball

2019/07/22 07:43

それ中身が出力されてないですね。 COMP-3云々じゃなくてファイル書き込みの問題です。 自分のコードを書きましょう。
kanitama111

2019/07/22 07:49

ありがとうございます。 中身とはbyte配列の中身でしょうか?
fuzzball

2019/07/22 07:53

そうです。あと、 >>パック10進数に変換したbyte配列の中身が[50,51,52,53,54,55,56,15]の8バイトで これも変な気がしますね。パック10進数に変換したデータに見えないです。
fuzzball

2019/07/22 07:55

ついでに、「小数の場合もあります」(誤字修正済)の意味も分からないです。 あなたが想定しているCOMP-3の仕様も書いて下さい。
kanitama111

2019/07/22 08:07

ありがとうございます。 変換前の数字は12345678です。 想定している仕様は下記のような感じです。 小数無しパターン例 PIC S9(0015) comp-3 小数有りパターン例 PIC S9(0009)V9(04) comp-3
fuzzball

2019/07/22 09:10 編集

ちなみに私は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
xebme

2019/07/22 20:00

英語版のほうが情報が多い。符号のバリエーションの記述があります。 https://en.wikipedia.org/wiki/Binary-coded_decimal JavaのBCD実装にもリンクがあります。 https://github.com/c-rack/bcd4j PackedEncoder.pack()メソッド。整数のみ、符号なしなので、事前にscale調整などが必要です。 >kanitama111さん ファイルへ出力はStringでなくbyte配列になります。エンコーディングはEBCDICではありませんか。
kanitama111

2019/07/23 00:48

>>fuzzballさん ありがとうございます。 comp-3への変換はソースを修正して対応できました。 ファイル送信先の環境については改めて確認致します。 >>xebmeさん ありがとうございます。 リンク先を確認させていただきます。 ファイルへの出力ですが、 byte配列で宣言した変数をそのまま設定していますが、Stringで出力されているようです。
退会済みユーザー

退会済みユーザー

2019/08/10 15:10

バイト出力してるんじゃなく、バイトコードを文字列として出力してるからNGなんだろうな
退会済みユーザー

退会済みユーザー

2019/08/10 15:15

つかさ [B@17ec9f7 って byte[] 型の ハッシュコード「17ec9f7」 (メモリ座標等) だからな
guest

回答2

0

質問の内容とは異なるのですが汎用機のCOBOL開発していたものですが、java化すると速度が極端に遅くなり使い物にならないという事象がありました。

投稿2019/08/10 12:14

akirafudo6

総合スコア341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/08/10 14:36

汎用機の知識しかない人がCOBOLのOCCURS(配列)をそのままオープン系のデータベースに移行したがる人が多くて、正規化の説明からしなくてはならず、グループ関数の使用例を用意して、こんな便利な機能が使えないし、極端にパフォーマンスが落ちますよ.... 疲れます。
退会済みユーザー

退会済みユーザー

2019/08/10 15:17

オラクル PLSQL の設計ミスを判断するのに3日かかったな・・・ A-COS置換・・
guest

0

以前、汎用機のCOBOLからオープン系に移行した時、COMP-3付きの数値項目付きのファイルはすべて、COBOL側でCOMP-3なしの数値項目(外部10進って言ったか?方言かも)で変換してもらってからオープン系に取り込んでいました。

汎用機メーカーのエンジニアからはそれ以外に方法はないとのことでした。

投稿2019/07/22 05:55

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問