Я пытаюсь «перевести» массив uint8_t [uint8_t lets_try [16]] в строку из 16 * 8 + 1 [нулевой символ] элементов. Например:преобразование uint8_t в строку [C]
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 [я] = buffer1 [i] + '0'; может ли кто-нибудь объяснить мне, почему следующие puts (buffer2) не будут работать правильно без + '0'? это нулевой символ в конце новорожденной строки, который заставляет puts() работать? [потому что с нулевым символом он знает, что он печатает настоящую строку?]
3) в коде выше puts (buffer2) дает правильный вывод, в то время как puts в main() ничего не дает; Я схожу с ума, снова и снова просматривая код, я не могу найти, что не так с этим
4) в моем решении Мне удалось преобразовать uint8_t в строку, проходящую из массива int: uint8_t- > int array-> string; есть ли способ сократить эту процедуру, переходя непосредственно из uint8_t в строку или улучшить ее? [В форумах я нашел только решения в C++] он работает, но я нахожу это немного тяжелым и не очень элегантный
Спасибо всем за поддержку
функция 'convert' вызывает неопределенное поведение, потому что она возвращает локальный массив. Вы должны использовать 'malloc'. – mch
Мне непонятно, что вы не понимаете ... первый цикл сдвигает биты байта один за раз, но заполняет буфер 1 цифрами 0 или 1. Добавляя '0' (это число 48 - значение ASCII символа 0) преобразует их в текст. Добавление '\ 0' (целое число 0) в конец завершает строку, поэтому puts() будет знать, где остановиться. –
Не '01010101' буква восьмого числа, а' 10101010' - десятичный номер литерала? –