Преобразование из целого числа в BCD

Я хочу преобразовать целое число (максимальное значение которого может достигать 99999999) в BCD и сохранить в массив из 4 символов.
Как например:
Ввод: 12345 (целое число)
Вывод должен быть = «00012345» в BCD, который хранится в массиве из 4 символов.
Вот 0x00 0x01 0x23 0x45 хранится в формате BCD.
Я попытался в следующем порядке, но не сработало

int decNum = 12345;
long aux;
aux = (long)decNum;
cout<<" aux = "<<aux<<endl;

char* str = (char*)& aux;
char output[4];
int len = 0;
int i = 3;
while (len < 8)
{
cout <<"str: " << len << " " << (int)str[len] << endl;
unsigned char temp = str[len]%10;
len++;
cout <<"str: " << len << " " << (int)str[len] << endl;
output[i] = ((str[len]) << 4) | temp;
i--;
len++;
}

Любая помощь будет оценена

0

Решение

str фактически указывает на длинный (вероятно, 4 байта), но итерация обращается к 8 байтам.
Операция str[len]%10 выглядит так, как будто вы ожидаете цифр, но есть только двоичные данные. Кроме того, я подозреваю, что i становится отрицательным.

0

Другие решения

Во-первых, не используйте броски в стиле C (например, (long)a или же (char*)). Они плохо пахнут. Вместо этого изучайте и используйте приведения в стиле C ++ (например, static_cast<long>(a)), потому что они указывают, где вы делаете опасные вещи, вместо того, чтобы просто молча работать и вызывать неопределенное поведение.

char* str = (char*)& aux; дает вам указатель на байтов aux — это на самом деле char* str = reinterpret_cast<char*>(&aux);, Это не дает вам традиционную строку с цифрами в нем. sizeof(char) это 1, sizeof(long) почти наверняка 4, поэтому в вашем aux переменная. Вы продолжаете пытаться прочитать 8 из них.

Я сомневаюсь, что это делает то, что вы хотите. Если вы хотите распечатать число в строку, вам придется запускать реальный код, а не просто переинтерпретировать биты в памяти.

std::string s; std::stringstream ss; ss << aux; ss >> s; создаст std::string с основанием-10 цифрами aux в этом.

Тогда вы можете посмотреть на символы в s построить свой BCD.

Это далеко не самый быстрый метод, но, по крайней мере, он близок к вашему первоначальному подходу.

0

Прежде всего, извините за код на C, я был обманут, так как это начиналось как вопросы на C, портирование на C ++ не должно быть таким уж большим делом.

Если вы действительно хотите, чтобы он был в массиве char, я сделаю что-то вроде следующего кода, я считаю полезным по-прежнему оставлять результат в формате с прямым порядком байтов, чтобы я мог просто привести его к int для распечатки, однако это не является строго обязательным:

#include <stdio.h>

typedef struct
{
char value[4];
} BCD_Number;

BCD_Number bin2bcd(int bin_number);

int main(int args, char **argv)
{
BCD_Number bcd_result;

bcd_result = bin2bcd(12345678);

/* Assuming an int is 4 bytes */
printf("result=0x%08x\n", *((int *)bcd_result.value));

}

BCD_Number bin2bcd(int bin_number)
{
BCD_Number bcd_number;

for(int i = 0; i < sizeof(bcd_number.value); i++)
{
bcd_number.value[i] = bin_number % 10;
bin_number /= 10;
bcd_number.value[i] |= bin_number % 10 << 4;
bin_number /= 10;
}

return bcd_number;
}
0