как преобразовать цифры из целого числа в байтовом массиве в C ++ - PullRequest
0 голосов
/ 12 ноября 2011

Я пытался преобразовать цифры из числа, такого как 9140, в массив байтов с символами, я наконец сделал это, но по какой-то причине одно из чисел было преобразовано неправильно.

Идея состоит в том, чтобы разделить каждую цифру, преобразовать ее в байт [4] и сохранить в глобальном массиве байтов, это означает, что массив имеет цифру каждые 4 позиции, я вставляю каждую цифру в конец массива и, наконец, введите количество цифр в конце массива.

проблема случайно с некоторыми значениями, например, для значения 25 он работает, но для 9140 он возвращает мне 9040, что может быть проблемой? это код:

void convertCantToByteArray4Digits(unsigned char *bufferDigits,int cant){
    //char bufferDigits[32];
    int bufferPos=20;
    double cantAux=cant;
    int digit=0,cantDigits=0;
    double subdigit=0;
    while(cantAux > 0){
        cout<<"VUELTA"<<endl;
        cantAux/=10;
        cout<<"cantAux/=10:"<<cantAux<<endl;
        cout<<"floor"<<floor(cantAux)<<endl;
        subdigit=cantAux-floor(cantAux);
        cout<<"subdigit"<<subdigit<<endl;
        digit=static_cast<int>(subdigit*10);
        cout<<"digit:"<<subdigit*10<<endl;
        cantAux=cantAux-subdigit;
        cout<<"cantAux=cantAux-subdigit:"<<cantAux<<endl;
        bufferDigits[bufferPos-4] = (digit >> 24) & 0xFF;
        std::cout<<static_cast<int>(bufferDigits[bufferPos-4])<<std::endl;
        bufferDigits[bufferPos-3] = (digit >> 16) & 0xFF;
        std::cout<<static_cast<int>(bufferDigits[bufferPos-3])<<std::endl;
        bufferDigits[bufferPos-2] = (digit >> 8) & 0xFF;
        std::cout<<static_cast<int>(bufferDigits[bufferPos-2])<<std::endl;
        bufferDigits[bufferPos-1] = (digit) & 0xFF;
        std::cout<<static_cast<int>(bufferDigits[bufferPos-1])<<std::endl;
        /*bufferDigits[0] = digit >> 24;
        std::cout<<bufferDigits[0]<<std::endl;
        bufferDigits[1] = digit >> 16;
        bufferDigits[2] = digit >> 8;
        bufferDigits[3] = digit;*/
        bufferPos-=4;
        cantDigits++;
    }
    cout<<"sizeof"<<sizeof(bufferDigits)<<endl;
    cout<<"cantDigits"<<cantDigits<<endl;
    bufferPos=24;
    bufferDigits[bufferPos-4] = (cantDigits) >> 24;
        //std::cout<<bufferDigits[bufferPos-4]<<std::endl;
    bufferDigits[bufferPos-3] = (cantDigits) >> 16;
    bufferDigits[bufferPos-2] = (cantDigits) >> 8;
    bufferDigits[bufferPos-1] = (cantDigits);

}

размер файла bufferDigits составляет 24 байта, параметр cant - это число для преобразования, я получаю любые вопросы о своем коде.

Ответы [ 4 ]

2 голосов
/ 13 ноября 2011

Мне кажется, это самый с ++ способ, которым , вероятно, отвечает на ваш вопрос, если я правильно понял:

#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>

template <typename It>
It tochars(unsigned int i, It out)
{
    It save = out;

    do    *out++ = '0' + i%10;
    while (i/=10);

    std::reverse(save, out);
    return out;
}

int main()
{
    char buf[10];

    char* end = tochars(9140, buf);
    *end = 0; // null terminate

    std::cout << buf << std::endl;
}
1 голос
/ 13 ноября 2011

Вместо использования функции double и floor, вместо этого просто используйте int и оператор модуля.

void convertCantToByteArray4Digits(unsigned char *bufferDigits,int cant)
{
  int bufferPos=20;
  int cantAux=cant;
  int digit=0,cantDigits=0;
  while(cantAux > 0)
  {
    cout<<"VUELTA"<<endl;
    digit = cantAux % 10;
    cout<<"digit:"<<digit<<endl;
    cantAux /= 10;
    cout<<"cantAux/=10:"<<cantAux<<endl;
    bufferDigits[bufferPos-4] = (digit >> 24) & 0xFF;
    std::cout<<static_cast<int>(bufferDigits[bufferPos-4])<<std::endl;
    bufferDigits[bufferPos-3] = (digit >> 16) & 0xFF;
    std::cout<<static_cast<int>(bufferDigits[bufferPos-3])<<std::endl;
    bufferDigits[bufferPos-2] = (digit >> 8) & 0xFF;
    std::cout<<static_cast<int>(bufferDigits[bufferPos-2])<<std::endl;
    bufferDigits[bufferPos-1] = (digit) & 0xFF;
    std::cout<<static_cast<int>(bufferDigits[bufferPos-1])<<std::endl;
    bufferPos-=4;
    cantDigits++;
  }
0 голосов
/ 13 ноября 2011

Почему так сложно? Просто разделите и возьмите остатки. Вот реентерабельный пример, для которого вы предоставляете буфер, и вы получаете указатель на начало преобразованной строки:

char * to_string(unsigned int n, char * buf, unsigned int len)
{
  if (len < 1) return buf;

  buf[--len] = 0;

  if (n == 0 && len > 0) { buf[--len] = '0'; }

  while (n != 0 && len > 0) { buf[--len] = '0' + (n % 10); n /= 10; }

  return &buf[len];
}

Использование: char buf[100]; char * s = to_string(4160, buf, 100);

0 голосов
/ 13 ноября 2011

Почему бы не использовать союз?

union {
  int i;
  char c[4];
};

i = 2530;
// now c is set appropriately

Или memcpy?

memcpy(bufferDigits, &cant, sizeof(int));
...