2009-10-20 4 views
3

Мне нужно каким-то образом преобразовать отдельные символы в RPGLE в целые числа - кто-нибудь знает хороший способ? Он должен работать на все возможные входы и идеально обеспечивать различное целое для каждого входа - по крайней мере, он должен обеспечивать другое значение для всех общих входов. Мне все равно, что такое целые числа. На C-подобном языке я бы взял значение ASCII или подобное - в идеале я хочу что-то эквивалентное этому.Как я могу получить значение EBCDIC для символа в RPGLE?

Пример, чтобы понять, как я хочу работать:

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, представляет собой однобайтовое не подписанное целочисленное поле. Переместите соответствующий символ в поле символа, а ваше целое число с не подписанным значением будет иметь требуемое значение 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.

И, наконец, если вы чувствуете действительно круто, вы можете создать однобайтовое целое число без знака и назначить его указателю. Затем вы можете сканировать любое поле персонажа или 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