TestBench.tools

BCD 변환기

BCD ↔ 10진수 변환. 니블 단위 검증과 오류 위치 표시.

Decimal
1234
BCD word
0x1234

이 툴은 패킹 BCD 워드를 10진수로, 10진수를 BCD로 변환합니다: 0x12341234. 모든 니블을 검증해서 0x12A4처럼 0xA가 들어간 워드는 잘못된 자리를 강조 표시하며 거부합니다 — 0xA는 10진 숫자가 아니기 때문입니다.

동작 원리

패킹 BCD는 최상위 자리부터 니블 하나에 10진 숫자 하나를 담습니다. 디코딩은 니블을 왼쪽부터 훑으며 누적값에 10을 곱해 더하고, 9를 넘는 니블이 나오면 그 위치와 함께 중단합니다. 인코딩은 반대로 10으로 나누며 숫자를 떼어 4비트씩 채웁니다. 결과적으로 어떤 수의 BCD 표현은 그 10진 자릿수를 16진수로 읽은 것과 동일합니다 — 바이너리/BCD 혼동이 그토록 찾기 어려운 이유이기도 합니다.

계산 예제

0x1234 → 1234
5678 → 0x5678
0x12A4 → 오류 — 니블 2가 0xA (0~9만 허용)

파라미터

ParameterValueNotes
인코딩패킹 BCD니블당 10진 숫자 1개
숫자 범위니블당 0 – 90xA–0xF는 오류
용량8자리 / 32비트0 … 99,999,999
오류 보고MSB 기준 니블 인덱스0부터 시작

C 구현

C
#include <stdint.h>

/* 패킹 BCD 워드 -> 10진수; 잘못된 니블이면 -1 */
long bcd_to_dec(uint32_t bcd, int nibbles)
{
    long value = 0;
    for (int i = nibbles - 1; i >= 0; i--) {
        uint32_t nib = (bcd >> (i * 4)) & 0xF;
        if (nib > 9) return -1;      /* 예: 0x12A4는 여기서 실패 */
        value = value * 10 + (long)nib;
    }
    return value;                    /* 0x1234 -> 1234 */
}

FAQ

패킹 BCD가 뭔가요?

4비트 니블 하나에 10진 숫자 하나(0~9)를 담는 인코딩입니다. 16진 워드 0x1234는 문자 그대로 숫자 1, 2, 3, 4 — 10진수 1234입니다. 구형 PLC 펑션블록, 썸휠 스위치, 7세그먼트 표시 드라이버가 BCD를 사용합니다.

0x12A4는 왜 오류인가요?

최상위에서 세 번째 니블(위치 2)이 0xA로, 9를 넘어 10진 숫자에 대응하지 않습니다. 이 변환기는 틀린 숫자를 조용히 만들어내는 대신 해당 니블을 정확히 강조 표시합니다.

BCD와 일반 16진수는 뭐가 다른가요?

BCD에서 0x1234는 10진수 1234지만, 같은 비트를 이진수로 읽으면 4660입니다. BCD 레지스터를 바이너리로(또는 그 반대로) 읽는 것은 PLC 연동의 고전적 버그입니다 — 값이 일정한 패턴으로 계속 틀리면 이것부터 의심하세요.

변환 가능한 범위는요?

8자리(32비트 워드)까지: 10진수 0~99,999,999. 숫자 한 자리가 4비트이므로 16비트 워드에는 4자리, 32비트 워드에는 8자리가 들어갑니다.

데이터가 업로드되나요?

아니요. 변환은 브라우저 안에서 실행됩니다.

관련 툴