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

how to convert digits from a integer in a byte array in C++

本文关键字:数组 整数 数字 转换 字节数 字节 c++      更新时间:2023-10-16

我试图将数字从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字节,can参数是要转换的数字,我收到关于我的代码的任何问题。

我觉得这是最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;
}

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

为什么不使用联合呢?

union {
  int i;
  char c[4];
};
i = 2530;
// now c is set appropriately

或memcpy吗?

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

为什么这么复杂?除法取余数。下面是一个可重入的示例,您为其提供了一个缓冲区,并返回一个指向转换后字符串开头的指针:

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