如何在C ++中从字节数组中的整数转换数字

时间:2011-11-12 19:58:20

标签: c++ byte bytebuffer

我试图将数字从9140这样的数字转换为字节的char数组,我终于做到了,但由于某种原因,其中一个数字转换错误。

这个想法是将每个数字分开并将其转换为字节[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 个答案:

答案 0 :(得分:2)

如果我理解正确的话,我觉得这是可能回答你问题的最c ++方式:

#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 :(得分:1)

不要使用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++;
  }

答案 2 :(得分:0)

为什么不使用工会?

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

i = 2530;
// now c is set appropriately

或memcpy?

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

答案 3 :(得分:0)

为什么这么复杂?只是划分并留下余地。这是一个可重入的示例,您可以向其提供缓冲区,并返回指向已转换字符串开头的指针:

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);