4

RPGLE の単一文字を整数に変換する方法が必要です - 誰か良い方法を知っていますか? 可能なすべての入力に対して機能し、理想的には入力ごとに異なる整数を提供する必要があります。少なくとも、すべての共通入力に対して異なる値を提供する必要があります。整数が何であるかは特に気にしません。C のような言語では、ASCII 値などを使用します。理想的には、それに相当する値が必要です。

どのように機能させたいかを明確にする例:

characterData = "Hello";
for i = 1 to %len(string);
    singleCharacter = %subst(characterData:i:1);
    number = myFunction(singleCharacter);
    dsply 'The value of ' + singleCharacter + ' is ' + %char(number);
endfor;

これは印刷されます

H の値は 72
e の値は 101
l の値は 108
l の値は 108
o の値は 111

ただし、実際には数字が何であるかは気にしないことに注意してください。数字は入力ごとに異なるだけです。

これらはすべて、RPGLE で文字データのハッシュ関数を作成するのに役立ちます。そのため、それを行う良い方法を知っていれば、それがより良い答えになります。

4

2 に答える 2

5

フィールド位置をオーバーレイするデータ構造を作成します。1 桁目の最初のフィールドは、1 バイトの文字フィールドです。2 番目のフィールドも位置 1 にあり、1 バイトの符号なし整数フィールドです。問題の文字を文字フィールドに移動すると、符号なし整数フィールドに必要な EBCDIC 値が含まれます。次に例を示します。

DConversion       DS
D CharacterValue          1      1A
D EBCDICValue             1      1U 0

/free
 CharacterValue = 'A';
 //Do something with EBCDICValue
/end-free

2 つのフィールドは同じ位置を占めるため、一方を変更すると他方も変更されます。プログラムは、2 つの変数を使用して、メモリ内の同じバイトをさまざまな方法で参照しているだけです。

次のように、より大きな文字フィールドを使用して、同じ場所に 1 バイトの符号なし整数の配列を配置することで、より洗練されたものにすることができます。

DConversionArray  DS                          
D CharacterField          1    100            
D EBCDICArray             1    100U 0 DIM(100)

/free
 CharacterField = 'We the people of the United States...';
 For I = 1 to %Len(%TrimR(CharacterField));
   X = EBCDICArray(I);
   //Do something with X
 EndFor;                                                  
/end-free

上記の例では、文字フィールドのサイズをループして、各 EBCDIC 値で何かを行います。

最後に、本当にクールな場合は、1 バイトの符号なし整数フィールドを作成して、ポインターに割り当てることができます。次に、サイズに関係なく、プログラム内の任意の文字フィールドまたは varchar フィールドをスキャンできます。文字フィールドの各バイトについて、そのメモリ アドレスを、1 バイトの符号なし整数フィールドに割り当てられたポインタに割り当てます。このような:

DEBCDICValue      S              3U 0 BASED(EBCDICPointer)
DEBCDICPointer    S               *
/free
 For I = 0 to %Len(%TrimR(CharacterField))-1;
   EBCDICPointer = %Addr(CharacterField)+I;
   X = EBCDICValue;
   //Do something with X
 EndFor;
/end-free
于 2009-10-21T12:46:46.683 に答える
0

大文字の A のアスキー値は 65 ですか?ebcdic 値を取得するように変更できます。これは、新しい関数を作成して、それをどのサービス プログラムに入れるかを決めるよりも簡単です。

d*Seen this and wonder why we still use it but its probably already there...
D Lo              c                   const('abcdefghijklmnopqrstuvwxyz')  
D Up              c                   const('ABCDEFGHIJKLMNOPQRSTUVWXYZ')  

eval x=%scan('A':UP)
if x <> 0
eval x +=64
endif
于 2019-01-31T17:00:42.800 に答える