スピードのために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がバイトサイズのように抽象化している基本的な概念や、私にはまだ分かりません。この時点では、出力はかなり異なっています。
私はこのステップを正しく実行した後、その目標から整数ベースの値を生成することです。
出力が正確でない理由を理解するための手掛かりは高く評価されます。
あなたがする必要がある最初の[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)を読んでください。 –
'const size_t len = strlen(バッファ);'をバイナリに使用できませんでした。 [strlen](http://www.tutorialspoint.com/c_standard_library/c_function_strlen.htm)はC文字列でのみ動作します。BTW読み取り関数が返す_正常に読み取られた要素の総数bytes_ – LPs
一般的な注意点として、16進数で印刷する場合は%xでprintf()を使用します。ここでstrlen()を確実に使用することはできません。成功すると、fread()とfwrite()は、読み書きされた項目の数を返します。この数値は、sizeが1のときに転送されたバイト数と同じです。したがって、strlen()の代わりに戻り値を使用してください。 – subin