The function below converts from decimal to densely-packed BCD. I need help in reverse engineering this function that converts it from densely-packed BCD to decimal in JavaScript. However, it would not produce correct results for 3 or more decimal digits when a densely-packed BCD is inputted. The input must be densely-paced BCD and the output must work for 3 and more decimal digits.
function dec_to_densely(x, packed){
const holder = packed.split("");
let densely_packed = new Array(10);
let merge = new Array(10000);
if (x.length % 3 != 0) {
if (x.length % 3 == 1){
for (let i = 0; i < 8; i++){
holder.unshift(0);
}
}
else {
for (let i = 0; i < 4; i++){
holder.unshift(0);
}
}
}
while (holder.length > 0) {
densely_packed[5] = holder[7];
densely_packed[9] = holder[11];
//000
if (holder[0] == '0' && holder[4] == '0' && holder[8] == '0') {
for (let i = 0; i < 3; i++){
densely_packed[i] = holder[i + 1];
}
for (let i = 3; i < 5; i++){
densely_packed[i] = holder[i + 2];
}
densely_packed[6] = '0';
for (let i = 7; i < 10; i++){
densely_packed[i] = holder[i + 2];
}
}
//001
else if (holder[0] == '0' && holder[4] == '0' && holder[8] == '1') {
for (let i = 0; i < 3; i++){
densely_packed[i] = holder[i + 1];
}
for (let i = 3; i < 5; i++){
densely_packed[i] = holder[i + 2];
}
densely_packed[6] = '1';
densely_packed[7] = '0';
densely_packed[8] = '0';
}
//010
else if (holder[0] == '0' && holder[4] == '1' && holder[8] == '0') {
for (let i = 0; i < 3; i++){
densely_packed[i] = holder[i + 1];
}
densely_packed[3] = holder[9];
densely_packed[4] = holder[10];
densely_packed[6] = '1';
densely_packed[7] = '0';
densely_packed[8] = '1';
}
//011
else if (holder[0] == '0' && holder[4] == '1' && holder[8] == '1') {
for (let i = 0; i < 3; i++){
densely_packed[i] = holder[i + 1];
}
densely_packed[3] = '1';
densely_packed[4] = '0';
densely_packed[6] = '1';
densely_packed[7] = '1';
densely_packed[8] = '1';
}
//100
else if (holder[0] == '1' && holder[4] == '0' && holder[8] == '0') {
densely_packed[0] = holder[9];
densely_packed[1] = holder[10];
densely_packed[2] = holder[3];
densely_packed[3] = holder[5];
densely_packed[4] = holder[6];
densely_packed[6] = '1';
densely_packed[7] = '1';
densely_packed[8] = '0';
}
//101
else if (holder[0] == '1' && holder[4] == '0' && holder[8] == '1') {
densely_packed[0] = holder[5];
densely_packed[1] = holder[6];
densely_packed[2] = holder[3];
densely_packed[3] = '0';
densely_packed[4] = '1';
densely_packed[6] = '1';
densely_packed[7] = '1';
densely_packed[8] = '1';
}
//110
else if (holder[0] == '1' && holder[4] == '1' && holder[8] == '0') {
densely_packed[0] = holder[9];
densely_packed[1] = holder[10];
densely_packed[2] = holder[3];
densely_packed[3] = '0';
densely_packed[4] = '0';
densely_packed[6] = '1';
densely_packed[7] = '1';
densely_packed[8] = '1';
}
//111
else if (holder[0] == '1' && holder[4] == '1' && holder[8] == '1') {
densely_packed[0] = '0';
densely_packed[1] = '0';
densely_packed[2] = holder[3];
densely_packed[3] = '1';
densely_packed[4] = '1';
densely_packed[6] = '1';
densely_packed[7] = '1';
densely_packed[8] = '1';
}
merge = merge.concat(densely_packed);
for (let i = 0; i < 12; i++){
holder.shift()
}
}
let dpacked = merge.join("");
return packed;
}