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

Posted

技术标签:

【中文标题】如何在C ++中将字节数组中的整数转换为数字【英文标题】:how to convert digits from a integer in a byte array in C++ 【发布时间】:2011-11-12 19:58:19 【问题描述】:

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

这个想法是将每个数字分开并将其转换为字节 [4] 并将其保存为一个全局字节数组,这意味着数组每 4 个位置都有一个数字,我将每个数字插入到数组的末尾,最后 i在数组末尾插入位数。

问题是随机出现的一些值,例如值 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 参数是要转换的数字,我收到有关我的代码的任何问题。

【问题讨论】:

I did it,然后是but the result is wrong。好矛盾 您正在混合十进制和二进制数的移位/除法。与样本9140 匹配的 char[] 数组是什么? jaja @sehe 是的,当我写这篇文章时我很困惑:P,当我说“我做到了”时,我可以将数字转换为字节,当我说“但结果错误”时是某些数字转换错误的时候:P 当我转换 9140 的每个数字时,char 数组中的输出是:(0,0,0,9)(for 9),(0,0,0,0)(for 1 ? ), (0,0,0,4)(for 4) 和 (0,0,0,0)(for 0) 所以我将每组 4 个字节从右到左写入 char 数组(...一些空字节...0,0,0,9,0,0,0,0,0,0,0,4,0,0,0,0,...字节数)。 @DiegoFernandoMurilloValenci,您尝试过我的解决方案吗? 【参考方案1】:

如果我理解正确的话,我觉得这是可能回答你问题的最 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;

【讨论】:

我的朋友,但是该代码将 int 转换为 char 数组,就像将 int 转换为字符串,但我需要将每个 int 数字转换为字节 [4] 并将其保存为char,因为我将此数组发送到 java 并再次转换为整数。 你做...什么?祝你好运。【参考方案2】:

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

【讨论】:

【参考方案3】:

为什么不使用联合?

union 
  int i;
  char c[4];
;

i = 2530;
// now c is set appropriately

还是memcpy?

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

【讨论】:

你好谢谢你的回复,联合将i的每个数字转换成一个字节[4]? memcpy 也一样? -1 因为问题指出:“这个想法是将每个数字分开并将其转换为一个字节[4]”。他想要五个字节 [4] 实体,一个用于可能的 4 位数字中的每一个,一个用于数字计数。 我使用联合,但对于每个数字不是整个数字并得到相同的结果,它将 9140 转换为包含 9040 的字节数组,我需要转换每个数字,因为我将其发送到 JAVA再次将其转换为整数。【参考方案4】:

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

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

【讨论】:

以上是关于如何在C ++中将字节数组中的整数转换为数字的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中将字节数组转换为整数?

如何在c ++中将数组字节转换为字符串?

如何在lua中将UTF8字节数组转换为字符串

如何在C#中将IntPtr转换为字节数组?

如何在 C 中将字节数组转换为十六进制字符串?

如何在 c#.net 中将结构转换为字节数组,但结构大小仅在运行时定义