2009-10-20 4 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에는 암호화 기능이 있습니다. 나는 암호화 기능을 사용했다. 이 경우, 당신이 볼 수 있도록 여기에 테스트 애플 리케이션을 게시 할 수 있습니다. –

답변

4

필드 위치를 오버레이하는 데이터 구조를 만듭니다. 위치 1의 첫 번째 필드는 1 바이트 문자 필드입니다. 두 번째 필드는 위치 1에 있으며 1 바이트의 부호없는 정수 필드입니다. 문제의 문자를 문자 필드로 이동하면 부호없는 정수 필드에 필요한 EBCDIC 값이 있습니다. 다음은 예입니다.

두 필드가 같은 위치를 차지하므로 하나를 변경하면 다른 필드가 변경됩니다. 프로그램은 두 변수를 사용하여 메모리의 같은 바이트를 다른 방식으로 봅니다. 크기를 통해 당신에게, 루프를 위의 예에서

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