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

Array of bytes into a string of comma separated int

本文关键字:分隔 整数 字符串 字节 字节数 数组 转换      更新时间:2023-10-16

我有一个控制计时器的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但是我必须在sprintf()中使用固定数量的"占位符"。

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

我应该走哪条路?

这是在普通 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;
} 

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

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

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

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