1

編集:このコードが私が思っていることをするかどうかはわかりません。誰かがそれをテストする方法を教えてもらえますか? つまり、メイン関数のバッファはどのように見えるべきですか? バッファには、タイプ (16 ビット)、長さ (32 ビット) の順序で 2 つのフィールドのデータがあると想定しています。バッファはファイルから読み込まれ、各フィールドはスペースで区切られていると想定しています。フィールドはネットワーク バイト オーダーで格納されており、それらを読み取るときにホスト バイト オーダーに変換し直す必要があります。

コードがファイルから内容を読み取り (ネットワーク バイト順である必要があります)、その内容をホスト バイト順で表示することを期待しています。型変換とファイル内のネットワーク バイト オーダーについて少し混乱しているため、テストに使用する値がわかりません。また、私のコードが正しく書かれているかどうかもわかりません。この種のことをしたり、そのような変換についてもう少し知っている人は、私のコードが正しいかどうか教えてくれますか?

コードは次のとおりです。

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

void printRecords(char *buffer)
{
     unsigned int recordType;
     unsigned long recordLength;
     char *data;
     char *index;

     if (!buffer)
         printf("Empty buffer\n");

     while(*buffer)
     {
        memcpy(&recordType,(const void *) buffer,2);
        buffer += 3;

        recordType = ntohs(recordType);
        printf("Record type normal: %u\n",recordType);

        memcpy(&recordLength,(const void *) buffer,4);
        buffer += 5;
        recordLength = ntohl(recordLength);
        printf("Record Length normal: %l\n",recordLength);

        break;
     }
}

void main()
{
     char * buffer = "0000000000000001 00000000000000000000000000000001";
     printRecords(buffer);

}
4

1 に答える 1

2
char *buffer = malloc(sizeof(buf));

sizeofは、「bufの型のサイズ」、つまりcharへのポインタのサイズを意味します。あなたはおそらくしたい

malloc(strlen(buf) + 1); /* 1 for trailing '\0' */

次に、バイトの値を文字列への変換と間違えています。「256」はバイト「2」の後にバイト「5」が続き、「6」-「2」は2に等しくない、「5」は等しくない〜5など。あなたが話している256は、代わりに00000001 00000000です(バイトをstdoutにダンプしてみてください。表示されます)。

また、recordTypeはunsignedではなくuint16_t型である必要があります。つまり、偏執的になりすぎることはありません。

編集:atoiは、次のようにcharへのポインタを取ります

atoi("123")

intへのポインタではありません!

于 2012-11-15T21:45:15.563 に答える