如何在RPGLE中获取角色的EBCDIC值?

时间:2009-10-20 18:33:18

标签: ibm-midrange rpgle rpg

我需要有一些方法将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;

这会打印

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中为角色数据构建哈希函数,所以如果你知道这样做的好方法,那么这将是一个更好的答案。

2 个答案:

答案 0 :(得分: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

因为两个字段占据相同的位置,所以更改另一个字段会改变另一个字段。你的程序只是使用两个变量以不同的方式查看内存中的相同字节。

你可以通过拥有一个更大的字符字段并在同一个地方有一个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

答案 1 :(得分:0)

我可以将大写A afaik的ascii值设为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