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 字节字符字段。第二个字段,也位于位置 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
于 2009-10-21T12:46:46.683 回答
0

我可以让你得到大写 A afaik 它的 65 的 ascii 值???您可以修改以获取 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 回答