我试图将 uint8_t [uint8_t Lets_try[16]] 数组“翻译”为 16*8+1[空字符] 元素的字符串。例如:
lets_try[0] = 10101010
lets_try[1] = 01010101
...
我想要一个像这样的字符串:
1010101001010101...[\0]
这里的问题是:1)有没有快速的方法来执行此操作?
我试图自己做这件事;我的想法是从将单个 uint8_t 变量转换为字符串并使用循环获取完整数组开始[我还没有完成最后一部分]。最后我写了这段代码:
int main()
{
uint8_t example = 0x14;
uint8_t *pointer;
char *final_string;
pointer = &example;
final_string = convert(pointer);
puts(final_string);
return(0);
}
char *convert (uint8_t *a)
{
int buffer1[9];
char buffer2[9];
int i;
char *buffer_pointer;
buffer1[8]='\0';
for(i=0; i<=7; i++)
buffer1[7-i]=( ((*a)>>i)&(0x01) );
for(i=0; i<=7; i++)
buffer2[i] = buffer1[i] + '0';
buffer2[8] = '\0';
puts(buffer2);
buffer_pointer = buffer2;
return buffer_pointer;
}
这里还有几个问题:
2)我不确定我是否完全理解我在网上找到的这个表达式的魔力:
buffer2[i] = buffer1[i] + '0';有人可以向我解释一下为什么如果没有+'0'下面的puts(buffer2)就不能正常工作吗?是新生字符串末尾的空字符使 put() 起作用吗? [因为使用空字符它知道它正在打印一个真正的字符串?]
3)在上面的代码中,puts(buffer2)给出了正确的输出,而main()中的puts没有给出任何结果;我疯狂地一遍又一遍地查看代码,我找不到问题所在
4)在我的解决方案中,我设法将 uint8_t 转换为从 int 数组传递的字符串:
uint8_t->int 数组->字符串;有没有办法缩短这个过程,直接从 uint8_t 传递到字符串中,或者改进它? [在论坛中我只找到了 C++ 中的解决方案]它可以工作,但我发现它有点重并且不那么优雅
感谢大家的支持
1.) 消除 int 数组要快一点。
2.) 添加'0'
更改整数值0
and 1
其 ASCII 值'0'
and '1'
.
3.) 返回局部变量的地址是未定义的行为。您必须在堆中分配内存。
4.) 是的,只需将其剪掉并一次完成整个操作
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char uint8_t;
char *convert(uint8_t *a)
{
char* buffer2;
int i;
buffer2 = malloc(9);
if (!buffer2)
return NULL;
buffer2[8] = 0;
for (i = 0; i <= 7; i++)
buffer2[7 - i] = (((*a) >> i) & (0x01)) + '0';
puts(buffer2);
return buffer2;
}
int main()
{
uint8_t example = 0x14;
char *final_string;
final_string = convert(&example);
if (final_string)
{
puts(final_string);
free(final_string);
}
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)