【发布时间】:2014-12-12 16:42:50
【问题描述】:
我正在尝试将 uint8_t [uint8_tlets_try[16]] 数组“翻译”为 16*8+1[null character] 元素的字符串。例如:
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) 我不确定我是否完全理解我在网上找到的这个表达式的魔力: 缓冲区2[i] = 缓冲区1[i] + '0';有人可以向我解释为什么没有 +'0' 下面的 puts(buffer2) 不能正常工作吗?是新生字符串末尾的空字符使 puts() 起作用吗? [因为它知道它正在打印一个真正的字符串?]
3) 在上面的代码中 puts(buffer2) 给出了正确的输出,而 main() 中的 puts 没有给出任何结果;一遍又一遍地看代码我疯了,我找不到它有什么问题
4) 在我的解决方案中,我设法将 uint8_t 转换为从 int 数组传递的字符串: uint8_t->int 数组->字符串;有没有办法缩短这个过程,直接从 uint8_t 传递到一个字符串,或者改进它? [在论坛中我只找到了 C++ 中的解决方案] 它可以工作,但我觉得它有点沉重而且不那么优雅
感谢大家的支持
【问题讨论】:
-
函数
convert调用未定义的行为,因为它返回一个本地数组。你应该使用malloc。 -
我不清楚你不明白什么......第一个循环一次移出一个字节的位,但是用数字 0 或 1 填充 buffer1。添加 '0 '(即数字 48——字符 0 的 ASCII 值)将它们转换为文本。将 '\0'(整数 0)添加到末尾会终止字符串,因此 puts() 将知道在哪里停止。
-
01010101不是八进制数字文字,10101010不是十进制数字文字吗?
标签: c arrays string pointers uint8t