2009-10-20 23 views
3

我需要一些將RPGLE中的單個字符轉換爲整數的方法 - 有誰知道一個好方法嗎?它必須爲所有可能的輸入工作,並理想地爲每個輸入提供不同的整數 - 至少它必須爲所有常用輸入提供不同的值。我不特別關心整數是什麼。在C語言中,我會採用ASCII值或類似的值 - 理想情況下我想要一些與之相當的東西。如何獲得角色在RPGLE中的EBCDIC值?

實例,使之清楚,我怎麼想它的工作:

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; 

這將打印

 
The value of H is 72 
The value of e is 101 
The value of l is 108 
The value of l is 108 
The value of o is 111 

但是請注意,我其實不關心的數字是什麼,只是他們對於每個輸入都是不同的。

所有這些都是爲RPGLE中的角色數據構建一個散列函數,所以如果你知道這樣做的好方法,那將是一個更好的答案。

+0

這個散列是用來加密的嗎? RPG中有加密功能可以爲你做到這一點。我已經使用了加密功能。如果是這種情況,我可以在這裏發佈我的測試應用程序供您查看。 – 2009-10-20 20:29:20

回答

4

創建覆蓋字段位置的數據結構。位置1中的第一個字段是一個1字節的字符字段。第二個字段也位於位置1,是一個1字節的無符號整數字段。將有問題的字符移動到字符字段,然後您的無符號整數字段將具有您需要的EBCDIC值。這裏是一個例子:

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

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

因爲兩個領域佔據相同的位置,改變一個改變另一個。您的程序只是使用這兩個變量以不同的方式查看內存中的相同字節。通過大小

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 

在上面的例子中,你的循環:

你可以通過具有較大的字符型字段愛好者,並有1個字節的未簽署整數數組在同一個地方像這樣的角色字段,並對每個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