преобразование uint8_t в строку [C]

Вопрос: Я пытаюсь "перевести" массив uint8_t [uint8_t lets_try [16]] в строку из 16 * 8 + 1 [нулевой символ] элементов. Например: lets_try[0] = 10101010 lets_try[1] = 01010101 ... и я хотел бы иметь строку вроде: 1010101001010101... [ 0] Здесь вопросы: 1) есть ли быстрый способ выполнить эту операцию? Я пытался сделать это сам; моя идея

Вопрос:

Я пытаюсь “перевести” массив 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]=’’; 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] = ‘’; puts(buffer2); buffer_pointer = buffer2; return buffer_pointer; }

Вот еще несколько вопросов:

2) Я не уверен, что полностью понимаю магию в этом выражении, которое я нашел в Интернете: buffer2 [i] = buffer1 [i] + ‘0’; может ли кто-нибудь объяснить мне, почему следующие puts (buffer2) не будут работать правильно без + ‘0’? это нулевой символ в конце новорожденной строки, который заставляет puts() работать? [потому что с нулевым символом он знает, что он печатает настоящую строку?]

3) в коде выше puts (buffer2) дает правильный вывод, а puts в main() ничего не дает; Я схожу с ума, снова и снова просматривая код, я не могу найти, что не так с этим

4) в моем решении мне удается преобразовать uint8_t в строку, проходящую из массива int: uint8_t-> int array-> string; есть ли способ сократить эту процедуру, переходя непосредственно из uint8_t в строку или улучшить ее? [в форумах я нашел только решения в C++], но я нахожу его немного тяжелым и не очень элегантным

Спасибо всем за поддержку

Лучший ответ:

1.) он немного быстрее, чтобы исключить массив int.

2.) добавление ‘0’ изменяет целые значения 0 и 1 на их значения 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; } Ответ №1

Вот один из способов…

char *uint8tob( uint8_t value ) { static uint8_t base = 2; static char buffer[8] = {0}; int i = 8; for( ; i ; —i, value /= base ) { buffer[i] = «01»[value % base]; } return &buffer[i+1]; } char *convert_bytes_to_binary_string( uint8_t *bytes, size_t count ) { if ( count < 1 ) { return NULL; } size_t buffer_size = 8 * count + 1; char *buffer = calloc( 1, buffer_size ); if ( buffer == NULL ) { return NULL; } char *output = buffer; for ( int i = 0 ; i < count ; i++ ) { memcpy( output, uint8tob( bytes[i] ), 8 ); output += 8; } return buffer; }; int main(int argc, const char * argv[]) { uint8_t bytes[4] = { 0b10000000, 0b11110000, 0b00001111, 0b11110001 }; char *string = convert_bytes_to_binary_string( bytes, 4 ); if ( string == NULL ) { printf( «Ooops!n» ); } else { printf( «Result: %sn», string ); free( string ); } return 0; }

… просто расширяется на 16 байт. Есть много способов, и это также зависит от того, что вы имеете в виду быстро. Встроенные системы,…? Вы можете сделать таблицу переводов, чтобы сделать ее еще быстрее,…

ОБНОВИТЬ

char *convert_bytes_to_binary_string( uint8_t *bytes, size_t count ) { if ( count < 1 ) { return NULL; } const char *table[] = { «0000», «0001», «0010», «0011», «0100», «0101», «0110», «0111», «1000», «1001», «1010», «1011», «1100», «1101», «1110», «1111» }; size_t buffer_size = 8 * count + 1; char *buffer = malloc( buffer_size ); if ( buffer == NULL ) { return NULL; } char *output = buffer; for ( int i = 0 ; i < count ; i++ ) { memcpy( output, table[ bytes[i] >> 4 ], 4 ); output += 4; memcpy( output, table[ bytes[i] & 0x0F ], 4 ); output += 4; } *output = 0; return buffer; }; int main(int argc, const char * argv[]) { uint8_t bytes[4] = { 0b10000000, 0b11110000, 0b00001111, 0b11110001 }; char *string = convert_bytes_to_binary_string( bytes, 4 ); if ( string == NULL ) { printf( «Ooops!n» ); } else { printf( «Result: %sn», string ); free( string ); } return 0; }

Оцените статью
Добавить комментарий