Google
オフコン練習帳内を検索
インターネット全体を検索

NECオフコン関連
オフコン一般
情報
[掲示板に戻る全部  1-  最新50
1 16進を10進に変換する方法
ゼロ 2006-8-5 8:59  [返信] [編集]

SYS@FDF内よりデータを抜き出してファイルを管理するデータベースを作りたいと思ったのですが、肝心な部分(更新回数、更新日等)が16進の為にそのままでは利用できませんでした。

COBOLで16進から10進に変換する方法を教えてもらえないでしょうか?

COBOLを利用する以外の方法でもかまいませんのでお願いします。



2 Re:16進を10進に変換する方法
江須扇 2006-8-5 18:14  [返信] [編集]

はじめましてゼロさん、江須扇と申します。



2バイト単位しか利用できませんが、USAGE COMP-1

を利用したらいかがでしょうか?



全く違う利用例ですがこの掲示板の181番にUSAGE COMP-1

を使ったCOBOLリストが載っております。



3 Re:16進を10進に変換する方法
ちょっと前までA-VXユーザ 2006-8-17 23:18  [返信] [編集]

USAGE COMP-1 って、2進数ですね。

16進数は、4bits表現で、0〜9,A〜Fですよね。

きっと間違っていないと思いますが、ちょっと気になって、



余計なお世話だったかな?



以上
4 Re:16進を10進に変換する方法
ゼロ 2006-8-18 10:18  [返信] [編集]

遅くなりましたが、江須扇様レスありがとうございました。


USAGE COMP-1を使用してレコード長、ブロック長、更新回数は問題なく10進に変換できました。


01 FDF-RECORDSIZE PIC X(2).  : 内容 '0256'(h)
01 WORK-RECORDSIZE.
 02 WORK-RSIZ1  PIC X(5).
 02 WORK-RSIZ2  REDEFINES WORK-RSIZ1 USAGE COMP-1.

MOVE FDF-RECORDSIZE TO WORK-RSIZ2.


これで、WORK-RSIZ1の内容が’256d’になっていました。

USAGE COMP-1の仕組みがよく理解できていないので結果論ですが、16進数→10進数の変換は出来たようです。

問題になったのが第1〜第4エクステント開始終了アドレス。
これは上記の方法で変換するとまったく意味不明な値が帰ってきたので下記のような変換テーブルを作って1バイトづつ判断して内部16進から外部16進に変換しました。
あとは16進→10進への計算ルーチンを作って10進にしました。
もっといい方法があるかもしれませんがこれしか思いつきませんでした。


01 H-TABLE  PIC X(16) VALUE ""00010203・・・0D0EOF"".
01 H-TBL  REDEFINES H-TABLE PIC X(1) OCCURS 16 TIMES.
01 D-TABLE  PIC X(32) VALUE "00010203・・・0D0E0F".
01 D-TBL  REDEFINES D-TABLE PIC X(2) OCCURS 16 TIMES.

5 Re:16進を10進に変換する方法
江須扇 2006-8-19 7:35  [返信] [編集]

>2バイト単位しか利用できませんが、USAGE COMP-1
>を利用したらいかがでしょうか?


という事で、4バイトの場合は、 USAGE COMP-2
を利用していただくこととなります。
但し、
COMP-1 が−32768≦x≦32767
COMP-2 が−2147483648≦y≦2147483647
となります。

詳しくは、COBOL言語説明書、2.4.3.4 データの表現形式
をご覧下さい。
6 Re:[5]:16進を10進に変換する方法
江須扇 2006-8-19 16:49  [返信] [編集]

ご指摘の通りですね。

COMP-1場合、
−32768≦x≦32767
となり、上1桁目のビットは負をあらわすので、
16進数を単純に10進数に戻せない場合があると言うことですね。

例えば、

02 REI1 USAGE IS COMP-1
02 REI1-ANS PIC 9(5)

IF REI1 < 0
   THEN COMPUTE REI1-ANS = REI1 + 65536
   ELSE MOVE REI1 TO REI1-ANS
END-IF

等の工夫が必要という事ですね。


2バイトまでしか使えないので、
4バイトの場合はCOMP-2を使いますがこれも
−2147483648≦y≦2147483647
なので

02 REI2 USAGE IS COMP-2
02 REI2-ANS PIC 9(10)

IF REI2 < 0
   THEN COMPUTE REI2-ANS = REI2 + 4294967296
   ELSE MOVE REI2 TO REI2-ANS
END-IF

6バイトの場合は

02 REI3.
  03 REI31 USAGE IS COMP-1
  03 REI32 USAGE IS COMP-2
02 REI31-ANS PIC 9(05)
02 REI32-ANS PIC 9(10)
02 REI3-ANS  PIC 9(15)

IF REI31 < 0
   THEN COMPUTE REI31-ANS = REI31 + 65536
   ELSE MOVE REI31 TO REI31-ANS
END-IF
IF REI32 < 0
   THEN COMPUTE REI32-ANS = REI32 + 4294967296
   ELSE MOVE REI32 TO REI32-ANS
END-IF
COMPUTE REI3-ANS = REI31-ANS * 4294967296 + REI32-ANS

等の作業が必要と言うことでしょうか?
7 Re:[5]:16進を10進に変換する方法
ゼロ 2006-8-22 13:02  [返信] [編集]

ありがとうございます、希望通りの結果を得ることができました。

プログラムもすっきりして大満足です。



上1桁が負を表すってことをすっかり忘れていました、2進数なんて20年近く前に情報処理二種の試験勉強した依頼なんで。



次の課題はデータのデータ上に直接持っていないデータの追加可能件数をどうやって求めるか頭をひねってみようと思います。
[掲示板に戻る全部 次100 最新50
BluesBB ©Sting_Band