0

Pythonで拡張したCコードがいくつかあります。拡張Cコードには、バイナリファイルに構造を追加する関数があります。

void writefunction(const struct struct1* some,const u_char* struct2){
    f=fopen('save.bin',"ab");
    if(f==NULL){
        printf("Unable to open file");
        exit(-1);
    }
    fwrite(some,sizeof(struct struct1),1,f);
    fwrite(struct2,sizeof(u_char),4,f);
    fclose(f);
}

これで、Pythonでコードをインポートしました。Pythonで2つのスレッドを開始したいと思います。1つはこのwritefunction()を実行し、もう1つは同じファイルを読み取ります。writefunctionは1つのスレッドで正しく機能していますが、ファイルから読み取るPython関数は機能していません。

私は何が間違っているのですか?

4

1 に答える 1

0

やらないでください。

ここでの問題は、「save.bin」ファイルの内容が、使用している C コンパイラに依存することです。おそらく、コンパイラに渡すいくつかのコマンド ライン パラメータに依存します。

構造体struct1がメモリに内部的に保持される方法は、コンパイラに依存します-少なくともビットフィールドを使用する場合。また、コンパイラがパディングを追加する場合もあります (以下の例を参照)。内部メモリ構造をファイルに書き込みます。

異なる言語で書かれた (そしておそらく異なるサーバーで実行されている) プログラムとデータを交換したい場合は、何らかの「ワイヤー」(シリアライゼーション) プロトコルを使用してそれらを変換する必要があります。

提案: おそらく JSON または XML を使用します。

構造体のパディングの例:

#include <stdio.h>

struct struct1 {
   char a;
   long b;
};

int main() {
   printf("%d %d %d\n", sizeof(char), sizeof(long), sizeof(struct struct1));
   return 0;
}

考えられる出力の 1 つは次のとおりです。

1 8 16
于 2012-04-14T06:15:35.723 に答える