2009-10-20 22 views
3

Je dois avoir un moyen de convertir des caractères simples dans RPGLE en entiers - est-ce que quelqu'un sait un bon moyen? Il doit fonctionner pour toutes les entrées possibles et idéalement fournir un entier différent pour chaque entrée - à tout le moins, il doit fournir une valeur différente pour toutes les entrées communes. Je ne me soucie pas particulièrement de ce que sont les nombres entiers. Dans un langage C j'aime prendre la valeur ASCII ou similaire - idéalement, je veux quelque chose d'équivalent à cela.Comment puis-je obtenir la valeur EBCDIC d'un personnage dans RPGLE?

exemple pour préciser comment je veux que cela fonctionne:

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; 

Ce imprimerait

 
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 

mais notez que je ne me soucie pas vraiment ce que les chiffres sont, juste qu'ils sont différents pour chaque entrée. Tout cela pour aider à construire une fonction de hachage pour les données de personnage dans RPGLE, donc si vous connaissez un bon moyen de faire cela, alors ce serait une meilleure réponse.

+0

Est-ce que ce hash va être utilisé pour le cryptage? Il existe des fonctions de cryptage dans RPG qui le feraient pour vous. J'ai utilisé les fonctions de cryptage. Si c'est le cas, je peux poster mon application de test ici pour que vous puissiez l'examiner. –

Répondre

4

Créer une structure de données superposant les positions de champ. Le premier champ, en position 1, est un champ de caractères de 1 octet. Le second champ, également en position 1, est un champ entier non signé de 1 octet. Déplacez le caractère en question dans le champ de caractères, puis votre champ entier non signé aura la valeur EBCDIC dont vous avez besoin. Voici un exemple:

DConversion  DS 
D CharacterValue   1  1A 
D EBCDICValue    1  1U 0 

/free 
CharacterValue = 'A'; 
//Do something with EBCDICValue 
/end-free 

Parce que les deux champs occupent la même position, un changement change l'autre. Votre programme utilise simplement les deux variables pour regarder le même octet en mémoire de différentes manières.

Vous pouvez obtenir colombophile en ayant un champ de caractères plus grandes et ont un tableau d'entiers un-signé 1 octet dans le même endroit comme celui-ci:

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 

Dans l'exemple ci-dessus, on boucle la taille du champ de caractères et faire quelque chose avec chaque valeur EBCDIC.

Enfin, si vous vous sentez vraiment cool, vous pouvez créer un champ de 1 octet entier non signé et l'affecter à un pointeur. Ensuite, vous pouvez parcourir n'importe quel champ de caractère ou de varchar dans votre programme, quelle que soit sa taille. Pour chaque octet du champ de caractères, attribuez son adresse mémoire au pointeur affecté à votre champ d'entier non signé de 1 octet. Comme ceci:

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