4

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'; 次の puts(buffer2) が +'0' なしでは正しく動作しない理由を誰かが説明してくれませんか? puts() を機能させるのは、生まれたばかりの文字列の末尾にあるヌル文字ですか? [ヌル文字を使用すると、実際の文字列を出力していることがわかるので?]

3) 上記のコードで puts(buffer2) は正しい出力を提供しますが、main() の puts は何も提供しません。コードを何度も見直して気が狂いそうです。何が悪いのかわかりません。

4) 私のソリューションでは、uint8_t を int の配列から渡される文字列に変換することに成功しました: uint8_t->int array->string; uint8_t から文字列に直接渡して、この手順を短縮する方法、または改善する方法はありますか? [フォーラムでは C++ のソリューションしか見つかりませんでした] 動作しますが、少し重く、エレガントではありません。

みんな応援ありがとう

4

2 に答える 2

5

1.) int 配列を削除する方が少し高速です。

2.) を追加すると'0'、整数値01がその ascii 値'0'およびに変更されます'1'

3.) ローカル変数のアドレスを返す動作は未定義です。ヒープ内のメモリを malloc する必要があります。

4.)はい、それを切り取って、すべての操作を1回で行います

#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;
}
于 2014-12-12T17:24:28.050 に答える
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: %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;
}
于 2014-12-12T17:43:10.853 に答える