2009-10-20 26 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