Я хочу преобразовать целое число (максимальное значение которого может достигать 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++;
}
Любая помощь будет оценена
str
фактически указывает на длинный (вероятно, 4 байта), но итерация обращается к 8 байтам.
Операция str[len]%10
выглядит так, как будто вы ожидаете цифр, но есть только двоичные данные. Кроме того, я подозреваю, что i
становится отрицательным.
Во-первых, не используйте броски в стиле 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.
Это далеко не самый быстрый метод, но, по крайней мере, он близок к вашему первоначальному подходу.
Прежде всего, извините за код на 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;
}