-1

要转换(213AFE)H为 BCD,首先必须将其转换为二进制,即(2177790)D. 现在每个数字都被转换成它的 BCD 码,它给出(0010 0001 0111 0111 0111 1001 0000)BCD.

另一种方法是将十六进制值转换为二进制,(0010 0001 0011 1010 1111 1110)B然后通过将大于 9 的每个数字加 6 来进行 BCD 调整,如下所示:

0010 0001 0011 1010 1111 1110
+              0110 0110 0110
-----------------------------
0010 0001 0100 0001 0110 0100 -> 35092368D

上述过程的最终结果是不同的。第二种方法错了吗?为什么?

4

4 回答 4

0

我使用此代码在 C 语言中将 1 字节从十六进制转换为 BCD,它仅适用于 0-99d。如果需要2byte,word,过程类似。

例如,它转换 78d(0x4E) => 0x78

uint8 convert2BCD(uint8 hexData)
{
    uint8    bcdHI=hexData/10;
    uint8    bcdLO=hexData%10;
    uint8    bcdData= (bcdHI<<4)+bcdLO;    

    return   bcdData;
  }
于 2020-06-17T13:45:42.123 回答
0

Ascii_Hex:                          ;procedure to convert Ascii to Hex
	mov rax,0
	mov rcx,4
	mov rsi,hex
	mov rbx,0
   loop1:
   	rol bx,4
	   mov al,[rsi]
   	cmp al,'9'
	   jbe sub30h
	   sub al,7h
      sub30h:
	      sub al,30h
	      add bx,ax
	   inc rsi
	loop loop1
ret

HtB:                                ;procedure to convert HEX to BCD
   io 1,1,msg,msglen
	io 0,0,hex,5
	call Ascii_Hex                   ;call to procedure to convert ascii to hex
	mov rcx,5
	mov ax,bx                     
	mov bx,0Ah
   loop2:	
	   mov rdx,0
   	Div bx                        
	   push dx
	loop loop2
	
	mov rsi,hex
	mov rcx,5
   loop3:
	   pop dx
	   add dl,30h
	   mov[rsi],dl
	   inc rsi
	loop loop3	
	io	1,1,hex,5
	io 1,1,newline,1
ret

于 2019-04-01T16:10:15.450 回答
0

这是一个 C 函数,用于将 uint32 转换为 BCD 并将其分别以十进制格式存储在数组中。请注意,定义的“len”是十进制格式的数据类型的最大长度,因此 uint32 完整值表示 4,294,967,295,即 10 位数。

#define len 10
void BCD(uint32_t value, uint8_t bcd[len])
{
    uint32_t factor;
    uint32_t decimal = len;
    uint32_t remains = value;    
    for(uint8_t i = 0; i < decimal; ++i)
    { 
        factor = 1;
        for (uint8_t j = 0; j < (decimal - i - 1); ++j) 
            factor *= 10;
        bcd[decimal - i - 1] = remains / factor;
        remains = remains % factor;
    }
    return;
}
于 2021-07-01T16:28:05.047 回答
-1

第二种方法没有错,但它实际上是转换的主要方法的一部分,即大于 9 的数字应始终通过 BCD 调整方法(通过添加 6)进行调整,您从中得到的答案是有效的 BCD!

于 2017-02-20T04:24:20.033 回答