我正在尝试将 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';有人可以向我解释为什么下面的 puts(buffer2) 在没有 +'0' 的情况下不能正常工作吗?是使 puts() 工作的新字符串末尾的空字符吗? [因为使用空字符它知道它正在打印一个真正的字符串?]

3) 在上面的代码中, puts(buffer2) 给出了正确的输出,而 main() 中的 puts 什么也没给出;我一次又一次地查看代码,我快疯了,我找不到那有什么问题

4) 在我的解决方案中,我设法将 uint8_t 转换为从 int 数组传递的字符串:
uint8_t->int 数组->字符串;有没有办法缩短这个过程,直接从 uint8_t 传递到一个字符串,或者改进它? [在论坛中,我只找到了 C++ 的解决方案] 它可以工作,但我觉得它有点沉重而且不太优雅

谢谢大家的支持

最佳答案

1.) 消除 int 数组要快一点。

2.) 添加 '0' 将整数值 01 更改为它们的 ascii 值 '0''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;
}

关于uint8_t 到字符串的转换 [C],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27448168/

10-11 22:13
查看更多