conversion of uint8_t to a string [C]
1.) it's a little bit faster to eliminate the int array.
2.) adding '0'
changes the integer values 0
and 1
to their ascii values '0'
and '1'
.
3.) it's undefined behaviour to return the address of a local variable. You have to malloc memory in the heap.
4.) yes, just cut it out and do the whole operation all in one
#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;
}
Antonino
IT-alian graduated in Europe [Sapienza University in Roma] with a Master summa cum laude in Electronics Engineering. After a successful internship in Sydney I've been working for 3 years as R&D engineer, developing pieces of code in C#, Android/Java, Python, JavaScript, Arduino, HTML/CSS. Later I moved to Product Management in the B2B SaaS space, first with a Product focused on Mobile Apps security and then with another in the Telecommunications space Currently based in Melbourne
Updated on July 19, 2022Comments
-
Antonino almost 2 years
I'm trying to "translate" an array of uint8_t [uint8_t lets_try[16]] to a string of 16*8+1[null character] elements. For example:
lets_try[0] = 10101010 lets_try[1] = 01010101
...
and I would like to have a string like:
1010101001010101...[\0]
Here the questions: 1) is there a quick way to perform this operation?
I was trying to do it on my own; my idea was starting from translating a single uint8_t variable into a string and obtaining the full array with a loop [I haven't done this last part yet]. At the end I wrote this code:
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; }
Here other few questions:
2) I'm not sure I fully understand the magic in this expression I found online: buffer2[i] = buffer1[i] + '0'; can somebody explain to me why the following puts(buffer2) is not going to work correctly without the +'0'? is it the null character at the end of the newborn string which makes the puts() work? [because with the null character it knows it's printing a real string?]
3) in the code above puts(buffer2) gives the right output while the puts in main() gives nothing; I'm going mad in looking again and again the code, I can't find what's wrong with that
4) in my solution I manage to convert an uint8_t into a string passing from an array of int: uint8_t->int array->string; is there a way to shorten this procedure, passing directly from the uint8_t into a string, or improve it? [in forums I found only solutions in C++] it works but I find it a little heavy and not so elegant
Thanks everybody for the support