简体   繁体   中英

Array of bytes into a string of comma separated int

I have an Arduino that controls timers. The settings for timers are stored in byte arrays. I need to convert the arrays to strings to SET a string on an external Redis server.

So, I have many arrays of bytes of different lengths that I need to convert to strings to pass as arguments to a function expecting char[] . I need the values to be separated by commas and terminated with '\\0'.

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

I have succeeded to do it manually for each array using sprintf() like this

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

That gives me an output string buf : 1,5,23,120 But I have to use a fixed number of 'placeholders' in sprintf() .

I would like to come up with a function to which I could pass the name of the array (eg timer[] ) and that would build a string, probably using a for loop of 'variable lengths' (depending of the particular array to to 'process') and many strcat() functions. I have tried a few ways to do this, none of them making sense to the compiler, nor to me!

Which way should I go looking?

Here is the low tech way you could do it in normal 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;
} 

an implementation, assuming that timer is an array (else, size would have to be passed as a parameter) with the special handling of the comma.

Basically, print the integer in a temp buffer, then concatenate to the final buffer. Pepper with commas where needed.

The size of the output buffer isn't tested, mind.

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

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM