2016-04-28 13 views
0

スピードのためにC言語に移植された単純なRubyコードを取得しようとしていますが、C言語が第1言語ではないため、実際には実現できません。何が原因なのか。ここでの目的を明確にするためのRubyのコードは次のとおりです。C言語でのバイナリ/整数の表現

source_file = open("/tmp/image.jpg") 
content = source_file.read 
content_binary_string = content.unpack("b*")[0] 
content_integer = content_binary_string.to_i(2) 

私は、同じ結果を達成するためにCでのいくつかの試みで遊んでてきたし、何とか私はRubyとCとのバイナリ比較に貼り付けられています出力する。ここで私はこれまで持っているCのコードは次のとおりです。

// gcc -Wall -Wextra -std=c99 xxd.c 
#include <stdio.h> 
#include <string.h> 

int main() { 
    char buffer[32]; 
    FILE *image; 
    image = fopen("/tmp/image.jpg","rb"); 
    while (!feof(image)) { 
    fread(buffer, sizeof(buffer), 1, image); 
    const size_t len = strlen(buffer); 
    for (size_t j = 0; j < len; j++) { 
     for (int i = 7; i >= 0; i--) { 
     printf(buffer[j] & (1 << i) ? "1" : "0"); 
     } 
    } 
    } 
    return 0; 
} 

Cコードがまだ完了していないと私は、現在の作業コードで出力を比較することができますので、私は今、バイナリ値を印刷するためだということに注意してくださいRubyがバイトサイズのように抽象化している基本的な概念や、私にはまだ分かりません。この時点では、出力はかなり異なっています。

私はこのステップを正しく実行した後、その目標から整数ベースの値を生成することです。

出力が正確でない理由を理解するための手掛かりは高く評価されます。

+2

あなたがする必要がある最初の[Cで良い初心者の本を見つけ](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-リスト)とそれを学ぶ。それから、[なぜwhile(!feof(file))が常に間違っているのですか?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)を読んでください。 –

+4

'const size_t len = strlen(バッファ);'をバイナリに使用できませんでした。 [strlen](http://www.tutorialspoint.com/c_standard_library/c_function_strlen.htm)はC文字列でのみ動作します。BTW読み取り関数が返す_正常に読み取られた要素の総数bytes_ – LPs

+3

一般的な注意点として、16進数で印刷する場合は%xでprintf()を使用します。ここでstrlen()を確実に使用することはできません。成功すると、fread()とfwrite()は、読み書きされた項目の数を返します。この数値は、sizeが1のときに転送されたバイト数と同じです。したがって、strlen()の代わりに戻り値を使用してください。 – subin

答えて

1
  1. feof()後の入力機能を使用しなければならない障害が発生したリードを示します。障害がEnd-of-Fileに起因するものかどうかを区別します。

  2. strlen()文字列の(ヌル文字は含まない)を報告します。 Cでは、文字列は、ヌル文字までの一連の文字です。これを使用して、バッファ内のバイト数を判断しないでください。戻り値はfread()です。 @subin

  3. 入力機能の戻り値を確認してください。 printf()への最初の引数として形式文字列でない文字列を使用して@user694733

  4. は避けてください。

  5. ビット操作で1uのようにunsignedを使用したほうがよい。

  6. マイナー:7のような魔法の数字を避けてください。CHAR_BIT<limit.h>でご覧になれます。

  7. マイナー:使用fclose()完了したらおもちゃを置いてください。


image = fopen("/tmp/image.jpg","rb"); 
    if (image == NULL) Handle_OpenFailure(); 

    size_t count; 
    while ((count = fread(buffer, sizeof buffer[0], sizeof buffer, image)) > 0) { 
    for (size_t j = 0; j < count; j++) { 
     for (int i = CHAR_BIT-1; i >= 0; i--) { 
     fputc(buffer[j] & (1u << i) ? '1' : '0', stdout); 
     } 
    } 
    } 
    fclose(image); 
関連する問題