2017-01-16 5 views
0

私はまだCプログラミングの新人です。私の目標はmtd0という名前のファイルに保存されたシリアル番号を取得し、そのシリアル番号を検証することです。Cプログラム - ファイル内の特定の文字列を検証する方法

dd if=/dev/mtd0 bs=1 skip=$((0x1fc30)) count=16 2>/dev/null 

、出力は次のようになります:bashで、コマンドがある

1866203214226041 

しかし、私は純粋なC言語でそれをやってみたい、私がこれまで試してみました何、このようなものです:

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    FILE *fp; 
    FILE *s; 

    fp = fopen("/tmp/mtd0","rb"); 
    if(NULL == fp) { 
     printf("\n Cannot open file!!!\n"); 
     return 1; 
    } 
    typedef unsigned char byte; 
    byte s_no[16]; 
    fseek(fp, 0x1fc30, SEEK_SET); 
    fread(s_no, 1, 16, fp); 
    printf ("Serial number: %s\n", s_no); 
    fclose(fp); 

    char mtd0[16]; 
    char defser[16]; 
    int ret; 

    memcpy(mtd0, s_no, 16); 
    memcpy(defser, "1866203214226041", 16); 

    ret = memcmp(mtd0, defser, 16); 

    if(ret == 0) 
    { 
     printf("Serial number is correct!\n"); 
    } 
    else 
    { 
     printf("Serial number is not correct\n"); 
    } 

    return(0); 
} 

しかし、私が実行すると、何も印刷されません。 mtd0は普通のテキストファイルではありませんが、何が呼び出されたのか分かりませんが、ファイルはthisのように見えます。だから私はどのように上記のコードを修正することができますか?

+0

これは*バイナリファイル*と呼ばれます。 –

+0

ああ、ありがとうございます。しかし、上記のコードを修正する方法を知っていますか? – hillz

+0

Cでは、文字列を比較するために 'strcmp'を使用する必要があります。文字列を比較するには' == 'ではなく、ファイルからデータを読み込むには' fread'を使用する必要があります。 – Alden

答えて

0

fseekはファイルからの読み取りを行わず、次の読み取りのためにファイルポインタを移動します。あなたはファイルから読み込むためにfreadを使う必要があります。 freadに関するドキュメントは、https://linux.die.net/man/3/freadにあります。 、Cの文字列の比較は、そのドキュメントをここで見つけることができますのstrcmpと呼ばれる機能を使用して行われているオールデンのコメントを1として

fopen("mtd0","rb"); 

さらに、それはバイナリモードでバイナリファイルを開くことをお勧めです。 https://linux.die.net/man/3/strcmp

最後に、あなたはおそらく完全にすなわち、mtd0へのパスを修飾する必要があります。:

fopen("/dev/mtd0","rb"); 
+0

それでもまだ何も印刷されません。上記のmtd0ファイルをダウンロードして、私のコードに間違いがないかどうか確認してください。上記のコードをあなたの提案で更新しました – hillz

+0

Freadは出力を返しません。Freadは出力された項目の数を返します。 freadのドキュメントをもう一度見てください。 – Irisshpunk

0

使用strcmp

if (strcmp (sn, "1866203214226041") != 0) { 
    printf("Serial number is correct\n"); 
} 
1

何をやっていると間違っていくつかのものがあります。

  1. fseek単に読み取りのためのファイルポインタを調整したり、ファイルから書きます。実際にはファイルから何も取得しません。また、fseek第3引数の有効値は、次のとおり

    • SEEK_SET - セット - ファイルの先頭に加え

    • SEEK_CUR第二引数の値にファイルポインタの位置を設定しますファイルポインターの現在の位置へのファイルポインターの位置に第2引数の値を加えたもの

    • SEEK_END - ファイルポインタの位置をファイルの末尾に設定します。

  2. あなたはバイト配列としてそのデータを保存したい、あなたが「位置0x1fc30でのファイルから16のバイトを読む」ためのものだろうと仮定すると、文字列ではありません:

    typedef unsigned char byte; 
    byte s_no[16]; 
    fseek(fp, 0x1fc30, SEEK_SET); 
    fread(s_no, 1, 16, fp); 
    
  3. ながら/dev/mtd0がバイナリファイルのように見えるので、シリアル番号がバイトのとして格納されている場合、strcmpはCの文字列を比較する正しい方法です。memcmpを使用して別のバイト配列の有効な値に設定します。シリアル。

+0

こんにちは、私はシリアル番号を比較してくれてありがとうございますが、私のコードには少し問題があります。シリアル番号はこのように最後に追加文字を表示することがあります。https://s27.postimg.org/dkumqgmcj/screenshot_2017_01_17_01_34_16.png私は自分の投稿でコードを更新しました。もう一度見てください – hillz

+0

@hillz文字列として出力する場合は、バイト配列を17要素長くし、最後の要素を手動で設定します( 's_no [16]') 'printf'を呼び出す前に' fread'を呼び出した後に0になるようにします。 –

関連する問題