質問
私は、プログラムLinuxにおけるC解析コアファイルから製造された組込みシステム。のコアファイルが少しエンディアン(アーム)はビッグエンディアン(MIPS、プログラム-分析し考察することができるものを走らせることになりちょっと小さめのエンディアンのホスト(x86)またはビッグエンディアン(PowerPC).
のヘッダを知っているかどうかのコアテルです。むしろ私のプログラム ない 知る必要があるかどうかのホストであったビッグエンディアンで、そういった利用APIとして扱いました。が無い場合より良いオプションの思いを開始に頼#ifdef__ッ_エンディアン__.
をLinuxカーネルをcpu_to_le32et al変換からネイティブのバイト順序に少しエンディアン等ユーザ空間ではありまhtonlれることがありますので、あらかに変換するからネイティブをビッグエンディアンが同等のためのネイティブに少しエンディアンができます。
誰でもできるので提案APIのユーザスペース?
編集:か、ちょっとした用事があるAPIについて知っているかどうか私のCPUがビッグには少しエンディアンやスワップbyesます。いってみっコード#ifdefsます。私は見ているだけでコードスニペットにスワップバイトまた者もいます。
他のヒント
#include <arpa/inet.h>
スタッフも保証 {ntoh,hton}{s,l}
.が必要な場合は変換が64ビット値、またはリトルエンディアン反転にはビッグエンディアン( ntoh
や hton
何もしないでいます。
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