質問

私は、プログラムLinuxにおけるC解析コアファイルから製造された組込みシステム。のコアファイルが少しエンディアン(アーム)はビッグエンディアン(MIPS、プログラム-分析し考察することができるものを走らせることになりちょっと小さめのエンディアンのホスト(x86)またはビッグエンディアン(PowerPC).

のヘッダを知っているかどうかのコアテルです。むしろ私のプログラム ない 知る必要があるかどうかのホストであったビッグエンディアンで、そういった利用APIとして扱いました。が無い場合より良いオプションの思いを開始に頼#ifdef__ッ_エンディアン__.

をLinuxカーネルをcpu_to_le32et al変換からネイティブのバイト順序に少しエンディアン等ユーザ空間ではありまhtonlれることがありますので、あらかに変換するからネイティブをビッグエンディアンが同等のためのネイティブに少しエンディアンができます。

誰でもできるので提案APIのユーザスペース?

編集:か、ちょっとした用事があるAPIについて知っているかどうか私のCPUがビッグには少しエンディアンやスワップbyesます。いってみっコード#ifdefsます。私は見ているだけでコードスニペットにスワップバイトまた者もいます。

役に立ちましたか?

解決

に基づくいかない(ELFコアダンプファイルなエンディアン課題だと思いをlibelf、 こちらの 素敵なチュートリアル こちらの, というの良いです。

このライブラリ作品の透過大とリトルエンディアンELFファイルとは、イブレア城、イブレア大LinuxでもFreeBSDの起源(通常の"./の設定"および"、"シーケンスが必要な全ての構築を行います。のために笑う"を読み取るプログラムヘッダテーブル"例(いくつかの変更をいやすさを提供します)上のx86コアファイルとMIPSはビッグエンディアンのコアファイルを示すことにより"けいたします。

他のヒント

#include <arpa/inet.h> スタッフも保証 {ntoh,hton}{s,l}.が必要な場合は変換が64ビット値、またはリトルエンディアン反転にはビッグエンディアン( ntohhton 何もしないでいます。

Linux(glibc), #include <endian.h> 以下の定義として適切なため、現在の機です。

htobe16  be16toh    htole16  le16toh
htobe32  be32toh    htole32  le32toh
htobe64  be64toh    htole64  le64toh

On*BSD, #include <sys/endian.h> これには同じマクロです。

アクセスできる場合は、ネオンコプロセッサやメモリは連続した例ビデオフレーム)の実行可能なswap16のフレームを使用q-レジスタ(128bytes)このよう;もちろん、時計のアライメントの課題

void swap16(void *__restrict src16)
{
    const void *start = src16;
    const void *end = src16 + FRAME_SIZE;
    asm volatile (
        "1: pld     [%0, #0x100]\n"
        "vld2.8         {q0,q1}, [%0]\n"
        "vmov           q2,q0\n"
        "vst2.8         {q1,q2}, [%0]!\n"
        "cmp            %1,%0\n"
        "bne            1b\n"
        : /* empty output operands */
        : "r" (start), "r" (end)
        : "cc", "memory"
        );
}

扱われていく場合には、ファイルのバイト配列として、そのコントロールの順序を選バイトのエンディアン-nessのおCPU実際にはmattering.

もこれは大いに有利に対配置。コアダンプがconcievablyてunaligned参照します。知っている可能性は低いと考え、これにより腐敗しています。この問題の回避を処理することによりファイルとしてのバイト配列になります。

このアプローチの実施jhead.

利用できる標準のネットワークbytswapping機能アパホテル/inet.h:

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); // Host to network
uint16_t htons(uint16_t hostshort); // Host to network
uint32_t ntohl(uint32_t netlong); // Network to host
uint16_t ntohs(uint16_t netshort); // Network to host

ネットワークバイト順序は、ビッグエンディアンです。※なので、これらの機能とは、次のものをいう。

hton*: Host endian to big endian
ntoh*: Big endian to host endian

武器agiは、dexで下がらないboxerぐ.

のカーネル-ヘッダを提供/usr/include/linux/byteorder/など__cpu_to_be32()および__be32_to_cpu()

とともに、/usr/include/linux/種類です。hファイルで定義の種類として明示的なbig/little endianは整数を多くしのミスマッチが検出するコンパイルす。

なぜ必要なのがフォローもよろしくお願いです。単に自分の機能を呼 htonl() (または何を出る時に、その逆のバイトです。しない音に必死に頑張っています。

のようなもの:

union {
    struct {
        unsigned char c0;
        unsigned char c1;
        unsigned char c2;
        unsigned char c3;
    } ch;
    uint32_t ui;
} u;
unsigned char t;

u.ui = htonl (hostlong);
t = u.ch.c0; u.ch.c0 = u.ch.c3 ; u.ch.c3 = t;
t = u.ch.c1; u.ch.c1 = u.ch.c2 ; u.ch.c2 = t;

この切り替えエンディアン-ess やすい, 私期用カスタムコードのようなことをいう表現を使用しているコードは、取り扱いendianityのポイント(入出力).

ることができ書(これらに基づくアップルのルーチン):

static inline uint16_t Swap16(uint16_t x)
{
    return ( (x << 8) | (x >> 8) );
}

static inline uint32_t Swap32(uint32_t x)
{
    return ( (((x ^ (x >> 16 | (x << 16))) & 0xff00ffff) >> 8) ^ (x >> 8 | data << 24) );
}

その後に定義することができ条件付きのマクロ:

#ifdef __BIG_ENDIAN__
# define htols(x) Swap16(x)
# define htoll(x) Swap32(x)
#else
# define htols(x) (x)
# define htoll(x) (x)
#endif

ックスとインテルアセンブラコードによっています:

// Swap16 is unchanged

static inline uint32_t Swap32(uint32_t x)
{
    __asm__ ("bswap %0" : "+r" (x));
    return ( x );
}
#ifdef __i386__
static inline uint64_t Swap64(uint64_t x)
{
    __asm__ ("bswap  %%eax\n\t"
             "bswap  %%edx\n\t"
             "xchgl  %%eax, %%edx"
             : "+A" (x));
    return ( x );
}
#elif defined(__x86_64__)
static inline uint64_t Swap64( uint64_t x )
{
    __asm__ ("bswap  %0" : "+r" (x));
    return ( x );
}
#endif
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top