2010-05-27 11 views
1

Mon problème est d'obtenir la clé 64 bits de l'utilisateur. Pour cela, j'ai besoin de 16 caractères sous forme de chaîne qui contient des caractères hexadécimaux (123456789ABCDEF). J'ai eu la chaîne de l'utilisateur et j'ai atteint les caractères avec le code ci-dessous. Mais je ne sais pas comment convertir le caractère en binaire 4 bits. dansMips comment puis-je convertir un caractère en binaire?

.data 


insert_into: 
    .word 8 

Ask_Input: 
    .asciiz "Please Enter a Key which size is 16, and use hex characters : " 


key_array: 
    .space 64 

.text 
.globl main 


main: 

    la $a0, Ask_Input 

    li $v0, 4 
    syscall 

    la $a0, insert_into 
    la $a1, 64 
    li $v0, 8 
    syscall 

    la $t0, insert_into 
    li $t2, 0 
    li $t3, 0 
    loop_convert: 
     lb $t1, ($t0) 
     addi $t0, $t0, 1 

     beq $t1, 10, end_convert 

# Now charcter is in $t1 but 
    #I dont know how to convert it to 4 bit binary and storing it 


     b loop_convert 

    end_convert:   

    li $v0, 10 # exit 
    syscall 

Répondre

0

Jetez un oeil à ce ASCII table vous verrez que le code hexadécimal pour les numéros de 9 et ci-dessous sont 0x9 et lettres majuscules c'est entre 0x41 et 0x5A AZ déterminer si son un numéro ou caractère, vous voyez si theres un nombre c'est tout fait, si c'était un masque de caractères avec 0x15 pour obtenir les quatre bits.

Si vous voulez inclure des lettres minuscules font même procédure avec masquage et déterminer si son char entre 0x61 et 0x7A

0

Je ne pense pas que masque avec 0x15 comme @ avis de Joelmob est la bonne solution.
Par exemple

'A' = 0x41 → 0x41 & 0x15 = 0
'B' = 0x42 → 0x42 & 0x15 = 0
'C' = 0x43 → 0x43 & 0x15 = 1
'D' = 0x44 → 0x44 0x15 = & 'E' = 0x45 → 0x45 0x15 = & 'F' = 0x46 → 0x46 0x15 = &

La méthode la plus simple consiste à soustraire avec le premier caractère. Je vais vous donner l'idée en C, vous pouvez facilement le convertir en MIPS asm

if ('0' < ch && ch < '9') 
{ 
    return ch - '0'; 
} 
else if ('A' < ch && ch < 'F') 
{ 
    return ch - 'A' + 10; 
} 
else if ('a' < ch && ch < 'f') 
{ 
    return ch - 'a' + 10; 
} 

une autre façon de mettre en œuvre:

if ('0' < ch && ch < '9') 
{ 
    return ch & 0x0f; 
} 
else if (('A' < ch && ch < 'F') || ('a' < ch && ch < 'f')) 
{ 
    return ch & 0x0f + 9; 
}