将整数数组转换为字符数组,每个整数每 3 位
Converting an Integer array to a char array, with every 3 digit per integer
我想转换通过测量压力生成的数组。
所以我得到了一个整数数组,像这样,我现在将使用 10 个样本,但完成后它可能会变成 20 个值:uint16_t ADCsample[10]= { 245, 332, 124, 98, 5, 156, 68, 199, 2, 105}
如您所见,值的范围是 0-350,没有负值。
我必须得到的输出是这样的:outputStr = {2,4,5,3,3,2,1,2,4,0,9,8,0,0,5,1,5,6,0,6,8,1,9,9,0,0,2,1,0,5}
因此所有整数值都被分开并放入一个新数组中,因此 ADCsample[0] = {245}
变为 outputStr[0-2] = {2,4,5}
。但是一位或两位数的样本必须在前面取值0,这是为了使输出具有恒定长度。
例如:ADCsample[4] = {5}
变为 outputStr[12-14]={0,0,5}
我需要将此数据发送到仅具有 160 个字符或类似字符限制的 SMS 的服务器。所以我必须立即发送完整的 outputStr。此外,所有计算都是在微控制器 MSP430G2553 上完成的,因此它必须高效且不会占用太多内存。
有什么提示或代码示例可以帮助我入门吗,我是这方面的新手,所以我不知道内置库的很多功能?我可以使用 sprintf() 或其他函数吗?这会占用很多内存吗?
您可以通过简单的数学运算从uint16_t
中获得三个字符:
uint16_t val = ...;
char hundredsDigit = (val / 100) + '0';
char tensDigit = ((val / 10) % 10) + '0';
char onesDigit = (val % 10) + '0';
当缺少数百 and/or 个十位数字时,这将产生零。
I need actual characters so I can print them through the print function that I got, this function can normally print all the characters in an array at once.
如果您希望使用打印字符串的函数来打印此内容,则需要以空值终止结果。在末尾添加一个额外的char
,并将其设置为零。
对于给定的数字,您可以按如下方式获取每个数字:
d1 = num / 100;
d2 = (num % 100) / 10;
d3 = num % 10;
第一个计算将整数除以 100,实际上去掉了 1 和 10 的数字,剩下的是 100 的数字。
第二个取除以 100 的余数,留下 0 到 99 之间的值,然后将结果除以 10,去掉 1 的数字,留下 10 的数字。
第三个取除以 100 的余数,留下 0 到 9 之间的值。
这段代码可以正常工作并且可以满足您的要求:
#include <stdio.h>
int main(void)
{
unsigned short ADCsample[10]= { 245, 332, 124, 98, 5, 156, 68, 199, 2, 105};
char outputStr[31];
for (unsigned short i = 0; i < 10; i++)
{
outputStr[(i * 3)] = ADCsample[i] / 100 + '0';
outputStr[(i * 3) + 1] = (ADCsample[i] / 10) % 10 + '0';
outputStr[(i * 3) + 2] = ADCsample[i] % 10 + '0';
}
outputStr[30] = '[=10=]';
printf("output : %s\n", outputStr);
return 0;
}
我添加了一个 printf 来显示结果。
outputStr 的大小应该是您的 int 数组的大小 * 3 + 1 才能正常工作。
此外,应根据您的 int 数组的大小更改 for 条件。
我想转换通过测量压力生成的数组。
所以我得到了一个整数数组,像这样,我现在将使用 10 个样本,但完成后它可能会变成 20 个值:uint16_t ADCsample[10]= { 245, 332, 124, 98, 5, 156, 68, 199, 2, 105}
如您所见,值的范围是 0-350,没有负值。
我必须得到的输出是这样的:outputStr = {2,4,5,3,3,2,1,2,4,0,9,8,0,0,5,1,5,6,0,6,8,1,9,9,0,0,2,1,0,5}
因此所有整数值都被分开并放入一个新数组中,因此 ADCsample[0] = {245}
变为 outputStr[0-2] = {2,4,5}
。但是一位或两位数的样本必须在前面取值0,这是为了使输出具有恒定长度。
例如:ADCsample[4] = {5}
变为 outputStr[12-14]={0,0,5}
我需要将此数据发送到仅具有 160 个字符或类似字符限制的 SMS 的服务器。所以我必须立即发送完整的 outputStr。此外,所有计算都是在微控制器 MSP430G2553 上完成的,因此它必须高效且不会占用太多内存。
有什么提示或代码示例可以帮助我入门吗,我是这方面的新手,所以我不知道内置库的很多功能?我可以使用 sprintf() 或其他函数吗?这会占用很多内存吗?
您可以通过简单的数学运算从uint16_t
中获得三个字符:
uint16_t val = ...;
char hundredsDigit = (val / 100) + '0';
char tensDigit = ((val / 10) % 10) + '0';
char onesDigit = (val % 10) + '0';
当缺少数百 and/or 个十位数字时,这将产生零。
I need actual characters so I can print them through the print function that I got, this function can normally print all the characters in an array at once.
如果您希望使用打印字符串的函数来打印此内容,则需要以空值终止结果。在末尾添加一个额外的char
,并将其设置为零。
对于给定的数字,您可以按如下方式获取每个数字:
d1 = num / 100;
d2 = (num % 100) / 10;
d3 = num % 10;
第一个计算将整数除以 100,实际上去掉了 1 和 10 的数字,剩下的是 100 的数字。
第二个取除以 100 的余数,留下 0 到 99 之间的值,然后将结果除以 10,去掉 1 的数字,留下 10 的数字。
第三个取除以 100 的余数,留下 0 到 9 之间的值。
这段代码可以正常工作并且可以满足您的要求:
#include <stdio.h>
int main(void)
{
unsigned short ADCsample[10]= { 245, 332, 124, 98, 5, 156, 68, 199, 2, 105};
char outputStr[31];
for (unsigned short i = 0; i < 10; i++)
{
outputStr[(i * 3)] = ADCsample[i] / 100 + '0';
outputStr[(i * 3) + 1] = (ADCsample[i] / 10) % 10 + '0';
outputStr[(i * 3) + 2] = ADCsample[i] % 10 + '0';
}
outputStr[30] = '[=10=]';
printf("output : %s\n", outputStr);
return 0;
}
我添加了一个 printf 来显示结果。 outputStr 的大小应该是您的 int 数组的大小 * 3 + 1 才能正常工作。 此外,应根据您的 int 数组的大小更改 for 条件。