将字节数组转换为逗号分隔的int字符串

时间:2018-01-17 22:00:17

标签: c++ arduino

我有一个控制计时器的Arduino。定时器的设置存储在字节数组中。我需要将数组转换为字符串以在外部Redis服务器上设置字符串。

所以,我有许多不同长度的字节数组,我需要转换为字符串作为参数传递给期望char[]的函数。我需要用逗号分隔值并以' \ 0'。

结束
byte timer[4] {1,5,23,120};
byte timer2[6] {0,0,0,0,0,0}

我已成功使用sprintf()像这样

为每个阵列手动完成
char buf[30];
for (int i=0;i<5;i++){ buf[i] = (int) timer[i];  }
   sprintf(buf, "%d,%d,%d,%d,%d",timer[0],timer[1],timer[2],timer[3],timer[4]);

这给了我一个输出字符串buf1,5,23,120 但我必须使用固定数量的占位符&#39;在sprintf()

我想提出一个函数,我可以传递数组的名称(例如timer[]),这将构建一个字符串,可能使用for循环的&#39;变量长度&# 39; (取决于特定阵列到&#39;进程&#39;)和许多strcat()函数。我已经尝试了几种方法来做到这一点,它们对编译器都没有意义,对我来说也没有意义!

我应该去哪看?

2 个答案:

答案 0 :(得分:3)

这是你在普通C中可以做到的低技术方式。

char* toString(byte* bytes, int nbytes)
{
    // Has to be static so it doesn't go out of scope at the end of the call.
    // You could dynamically allocate memory based on nbytes.
    // Size of 128 is arbitrary - pick something you know is big enough.
    static char buffer[128];
    char*       bp = buffer;
    *bp = 0;  // means return will be valid even if nbytes is 0.
    for(int i = 0; i < nbytes; i++)
    {
        if (i > 0) {
            *bp = ','; bp++;
        }
        // sprintf can have errors, so probably want to check for a +ve
        // result.
        bp += sprintf(bp, "%d", bytes[i])
    }
    return buffer;
} 

答案 1 :(得分:1)

一个实现,假设timer是一个数组(否则,size必须作为参数传递)以及逗号的特殊处理。

基本上,在temp缓冲区中打印整数,然后连接到最终缓冲区。在需要的地方胡椒用逗号。

请注意,输出缓冲区的大小未经过测试。

#include <stdio.h>
#include <strings.h>

typedef unsigned char byte;

int main()
{
   byte timer[4] = {1,5,23,120};
   int i;

   char buf[30] = "";
   int first_item = 1;

   for (i=0;i<sizeof(timer)/sizeof(timer[0]);i++)
   {
      char t[10];
      if (!first_item)
      {
         strcat(buf,",");   
      }
      first_item = 0;

      sprintf(t,"%d",timer[i]);
      strcat(buf,t);
    }

   printf(buf);

}