我需要某种方法将 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 中为字符数据构建哈希函数,所以如果您知道这样做的好方法,那么这将是一个更好的答案。
最佳答案
创建覆盖字段位置的数据结构。第一个字段位于位置 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
关于ibm-midrange - 如何在 RPGLE 中获取角色的 EBCDIC 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1596488/