5

私の仕事は、データ ファイルを C を使用してビッグ エンディアンからリトル エンディアンに、またはその逆に変換することです。オンラインで約 3 時間、他の例を探したり、教科書を読んだりしていますが、これを開始する方法にも行き詰まっています。関数。

これまでのところ、イベントの順序は正しい (1 ~ 4) ですが、convert_and_save関数内で → を使用して char 配列を作成する必要がありますchar buffer[4];か?

誰か助けてくれませんか?何を調べるかについての手がかりを教えていただければ幸いです。

次の関数を作成する必要があります。

void convert_and_save(struct record item, FILE * output_handle, int number);

この関数内で、次の一連の手順を実行します。

  1. 次を使用して、整数を文字の配列に変換します。

    int integer_to_characters(int number, char * buffer)
    {
       memcpy(buffer, &number, 4);
    }
    
  2. その配列内の文字の順序を逆にします。

  3. 次を使用して、文字の配列を整数に変換します。

    int characters_to_integer(char * buffer)
    {
       int result;
       memcpy(&result, buffer, 4);
       return result;
    }
    
  4. 次を使用して、変換されたレコードを出力ファイルに書き込みます。

    void save_record(FILE * file_handle, struct record a)
    {
       char output_buffer[size_of_record];
       integer_to_characters(a.age, &(output_buffer[0]));
       memcpy(&(output_buffer[4]), a.name, 12);
       integer_to_characters(a.department, &(output_buffer[16]));
       fwrite(output_buffer, sizeof(char), size_of_record, file_handle);
    }
    
4

5 に答える 5

7

これらは標準機能ではありません (これらは gcc 拡張機能です) が、使用できる場合があります。

— 組み込み関数: uint16_t __builtin_bswap16 (uint16_t x) バイトの順序を逆にして x を返します。たとえば、0xaabb は 0xbbaa になります。ここでのバイトは常に正確に 8 ビットを意味します。

— 組み込み関数: uint32_t __builtin_bswap32 (uint32_t x) 引数と戻り値の型が 32 ビットであることを除いて、__builtin_bswap16 と同様です。

— 組み込み関数: uint64_t __builtin_bswap64 (uint64_t x) 引数と戻り値の型が 64 ビットであることを除いて、__builtin_bswap32 と同様です。

これらを使用できる場合は、プラットフォームに最適なコードが得られる可能性があります。そうでない場合は、gcc にパッチを送信してください:)

Clangにもあります__builtin_bswap16() __builtin_bswap32() __builtin_bswap64()

ビジュアルスタジオ

unsigned short _byteswap_ushort (
   unsigned short val
);
unsigned long _byteswap_ulong (
   unsigned long val
);
unsigned __int64 _byteswap_uint64 (
   unsigned __int64 val
);

ICCは_bswap16, _bswap and _bswap64*さらなる参照が必要です

于 2014-07-21T02:40:51.937 に答える