【问题标题】:How can I convert hex string to binary?如何将十六进制字符串转换为二进制?
【发布时间】:2010-05-27 14:21:40
【问题描述】:

我的问题是从用户那里获取 64 位密钥。为此,我需要获取 16 个字符作为包含十六进制字符(123456789ABCDEF)的字符串。我从用户那里得到了字符串,我用下面的代码找到了字符。但我不知道如何将字符转换为 4 位二进制

.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

【问题讨论】:

    标签: input hex mips data-conversion spim


    【解决方案1】:

    我不认为用 0x15 掩盖 @Joelmob 的意见是正确的解决方案,因为

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

    不会产生任何相关的二进制值

    最简单的方法是从字符值中减去范围的下限。我将在 C 中给出想法,您可以轻松地将其转换为 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;
    }
    

    另一种实现方式:

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

    但是,这可以使用以下问题中描述的技术进一步优化为单个比较

    现在检查可以改写如下

    if ((unsigned char)(ch - '0') <= ('9'-'0'))
    if ((unsigned char)(ch - 'A') <= ('F'-'A'))
    if ((unsigned char)(ch - 'a') <= ('f'-'a'))
    

    任何现代编译器都可以进行这种优化,here is an example output

    hex2(unsigned char):
            andi    $4,$4,0x00ff     # ch, ch
            addiu   $2,$4,-48      # tmp203, ch,
            sltu    $2,$2,10         # tmp204, tmp203,
            bne     $2,$0,$L13
            nop
            andi    $2,$4,0xdf       # tmp206, ch,
            addiu   $2,$2,-65      # tmp210, tmp206,
            sltu    $2,$2,6  # tmp211, tmp210,
            beq     $2,$0,$L12         #, tmp211,,
            andi    $4,$4,0xf        # tmp212, ch,
    
            j       $31
            addiu   $2,$4,9        # D.2099, tmp212,
    
    $L12:
            j       $31
            li      $2,255                  # 0xff   # D.2099,
    
    $L13:
            j       $31
            andi    $2,$4,0xf        # D.2099, ch,
    

    【讨论】:

      【解决方案2】:

      看看这个ASCII table,你会看到 9 及以下数字的十六进制代码是 0x9,大写字母介于 0x41 和 0x5A A-Z 之间,确定它是数字还是字符,你看看是否有如果它是一个带有 0x15 的字符掩码来获得四位,那么它就完成了。

      如果您想包含小写字母,请执行相同的屏蔽过程并确定其是否为 0x61 和 0x7A 之间的字符

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 2016-07-07
        • 2022-07-21
        • 2013-02-07
        • 2021-10-30
        • 2017-05-26
        相关资源
        最近更新 更多