2016-09-30 9 views
1

文字配列( 'hi \ n'など)をバイナリに変換し、int配列に格納する次のコードがあります。バイナリ変換のCharは突然間違っていますか?

void data_to_binary(char *data){ 

bit_pos = 0; 
int i = 0, j = 0, k = 0; 
char mask = 0x80; 

for(i = 0; i < sizeof(data); ++i){ 
    if(data[i] != '\0' && data[i] != '\n'){ 
     mask = 0x80; 
     for(j = 0; j < 8; ++j){ 
      binary_data[bit_pos] = ((data[i] & mask) > 0); 
      mask >>= 1; 
      bit_pos++; 
     } 
    } 
} 
} 

これは完全に機能しました。私は01101000 01101001こんにちは。私はこのコードについて何も変えずに、最近もう一度実行しました。私は今、01111111 01111111を取得しています....何が起こっているのか分かりません。無関係のコードを手にしながら、ヒープの破損エラーが発生しました。これが原因ですか?まだそれは私のコードに悪影響を及ぼしていますか?

+4

'sizeof(data)'が間違っています。配列のサイズは、ポインターのサイズだけではありません。 'data'がCの文字列(NULで終了)なら' strlen(data) 'を使います。それ以外の場合は、配列の長さを関数に渡す必要があります。 – kaylum

+0

私は残念ながら配列のサイズを知りません。ユーザーは最大1024文字で入力します。そしてそれは2に等しいので、 'hi'の場合、実際には動作します。だから私の問題は解決しません。 –

+0

'strlen?'おそらく?または「n = 0」である。 while(* data)n ++; '? –

答えて

2
  1. sizeof(データ)はどのようなものになると思いますか?代わりにstrlenを使用しませんか?
  2. マスクに符号付き文字を使用しています。最初に "mask >> = 1;"を実行した後0x40の代わりに0xC0が得られます。シフト後に符号が設定されないようにするには、intまたはunsigned charを使用してください。
関連する問題