4

サイズが 6 の unsigned char 配列があります。バイト配列の内容は整数 (4096*Unix 時間からの秒数) です。バイト配列がビッグエンディアンであることは知っています。

このバイト配列を int_64 に変換するために使用できる C のライブラリ関数はありますか、それとも手動で行う必要がありますか?

ありがとう!

PS: 念のため、さらに情報が必要な場合は、はい、Unix タイムスタンプを解析しようとしています。これが私が扱っているタイムスタンプのフォーマット仕様です。

4

5 に答える 5

8

C99実装が提供する場合がありますuint64_t(正確に64ビットであるネイティブの固定幅整数がない場合は提供する必要はありません)。その場合、次を使用できます。

#include <stdint.h>

unsigned char data[6] = { /* bytes from somewhere */ };
uint64_t result = ((uint64_t)data[0] << 40) |
                  ((uint64_t)data[1] << 32) |
                  ((uint64_t)data[2] << 24) |
                  ((uint64_t)data[3] << 16) |
                  ((uint64_t)data[4] << 8)  |
                  ((uint64_t)data[5] << 0);

C99の実装で提供されない場合uint64_tでも、unsigned long long または(私は思う)を使用できますuint_least64_t。これは、ホストのネイティブエンディアンに関係なく機能します。

于 2012-05-16T00:21:16.970 に答える
0

これを試してみてください:

unsigned char a [] = {0xaa,0xbb,0xcc,0xdd,0xee,0xff};
unsigned long long b = 0;
memcpy(&b,a,sizeof(a)*sizeof(char));
cout << hex << b << endl;

または、手動で行うこともできます。これにより、アーキテクチャ固有の問題を回避できます。

互換性の点で上記のソリューションよりも優れているメモリブロックの順序をエミュレートしようとするのではなく、通常の整数演算(合計とシフト)を使用することをお勧めします。

于 2012-05-16T00:18:02.070 に答える
0

それを行う最良の方法は、ユニオンを使用することだと思います。

union time_u{
    uint8_t data[6];
    uint64_t timestamp;
}

次に、参照することにより、そのメモリ空間をバイト配列または uint64_t として使用できます。

union time_u var_name;
var_name.data[i]
var_name.timestamp
于 2014-05-15T21:58:53.103 に答える
-1

パックオプションを使用できます

#pragma pack(1)

また

__attribute__((packed))

コンパイラに応じて

typedef struct __attribute__((packed))
{
    uint64_t u48: 48;
} uint48_t;

uint48_t data;

memcpy(six_byte_array, &data, 6);
uint64_t result = data.u48;

見る

于 2013-08-02T08:21:37.173 に答える