Javasciprt

부호있는 16진수를 10진수로 변환

씬프 2024. 3. 2. 22:48
반응형

최근 바이트로 저장된 값을 10진수로 변환하여 DB에 저장하는 로직을 구현해야했다.
단순히 부호가 없는 경우 parseInt 내장함수를 사용해 10진수로 변환할 수 있다.

const buf = 'a1d2';
const num = parseInt(buf, 16);
console.log(num); // 41426

부호가 있는 경우 맨 앞 자리의 숫자에 따라 음수, 양수로 나눠지며 계산하는 방법도 달라진다.
부호가 있는 16진수의 경우 앞자리가 07은 양수, 8F는 음수다.
(2진수로 변환시 맨 앞 비트가 0이면 양수, 1이면 음수)

2진수로 변환 후 맨 앞 비트에 따라 부호를 판단하고,
1의 보수를 구해 10진수로 변환하고 음수 변환을 한다.

function getDecimal(buf) {
  // padStart를 사용하면 자릿수 만큼 해당 문자로 채울 수 있다.
  const binary = parseInt(buf, 16).toString(2).padStart(16, '0');

  const isNegative = binary.charAt(0) === '1'

  // 음수일 경우에 사용될 2진수 1의 보수
  const invertBin = binary.split('').map(char => char === '1' ? '0' : '1').join('');

  // 음수일 경우 1의 보수를 10진수로 변환 후 음의 부호, 아닐 경우 2진수를 10진수로 변환
  const decimal = isNegative ? -parseInt(invertBin, 2) : parseInt(bin, 2);

  return decimal;
}

getDecimal('a1d2') // -24109
getDecimal('1323') // 4899