我正在尝试将uint8_t [uint8_t lets_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)我不确定我完全理解我在网上找到的这个表达的魔力: buffer2 [i] = buffer1 [i] +'0';可以有人向我解释为什么以下的put(buffer2)在没有+'0'的情况下无法正常工作?是新生的字符串末尾的空字符使puts()工作? [因为使用空字符,它知道它正在打印一个真正的字符串?]
3)在上面的代码中,puts(buffer2)给出正确的输出,而puts()中的puts则什么都没有给出;我疯狂地一遍又一遍地看着代码,我找不到那个
的错误4)在我的解决方案中,我设法将uint8_t转换为从int数组传递的字符串: uint8_t-&gt; int array-&gt; string;有没有办法缩短这个过程,直接从uint8_t传递到一个字符串,或改进它? [在论坛中我发现只有C ++中的解决方案]它有效,但我发现它有点沉重而且不那么优雅
感谢大家的支持
答案 0 :(得分:4)
1。)消除int数组要快一点。
2。)添加'0'
会将整数值0
和1
更改为其ascii值'0'
和'1'
。
3。)返回本地变量的地址是未定义的行为。你必须在堆中使用malloc内存。
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 :(得分:0)
这是单程......
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: %s\n", 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: %s\n", string );
free( string );
}
return 0;
}