⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xtunnelsbyteorder.h

📁 xtunnel nat/fw traversal source code
💻 H
字号:
/*	File:       XTunnelsByteOrder.h	Contains:   Endian swapping functions	Copyright:  (c) 2003 by Xten Networks, Inc., all rights reserved.*/#ifdef __MWERKS__#pragma once#endif // __MWERKS__#ifndef XTUNNELSBYTEORDER_H_2CB931C0_0F06_4705_86D3_782670C7C203#define XTUNNELSBYTEORDER_H_2CB931C0_0F06_4705_86D3_782670C7C203#if VS_TARGET_OS_LINUX#include <sys/types.h>#else#include <machine/types.h>#endif // VS_TARGET_OS_LINUX#if VS_TARGET_OS_MAC && !defined(__BIG_ENDIAN__)    #define __BIG_ENDIAN__ 1#elif defined(__i386) && !defined(__LITTLE_ENDIAN__)    #define __LITTLE_ENDIAN__ 1#elif VS_TARGET_OS_OPENBSD && !defined(__LITTLE_ENDIAN__)    #define __LITTLE_ENDIAN__ 1#endif#if !defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)#error Do not know the endianess of this architecture#endif#if defined(__BIG_ENDIAN__) && defined(__LITTLE_ENDIAN__)#error Seem to be very confused about the endianess of this architecture#endif#if defined(__cplusplus)extern "C" {#endiftypedef enum __XTunnelsByteOrder    {   XTunnelsByteOrderUnknown,   XTunnelsByteOrderLittleEndian,   XTunnelsByteOrderBigEndian   } XTunnelsByteOrder;static inline XTunnelsByteOrder XTunnelsByteOrderGetCurrent(void) {    u_int32_t x = (XTunnelsByteOrderBigEndian << 24) | XTunnelsByteOrderLittleEndian;    return (XTunnelsByteOrder)*((u_int8_t *)&x);}static inline u_int16_t XTunnelsSwapInt16(u_int16_t arg) {#if defined(__i386__)    u_int16_t result;    __asm__ volatile("rorw $8,%0" : "=r" (result) : "0" (arg));    return result;#elif defined(__ppc__) && defined(__GNUC__)    u_int16_t result;    __asm__ volatile("lhbrx %0, 0, %1" : "=r" (result) : "r" (&arg) : "r0");    return result;#elif 0    u_int16_t result;    result = ((arg<<8) & 0xFF00) | ((arg>>8) & 0x00FF);    return result;#else    union XTunnelsSwap {	u_int16_t sv;	u_int8_t uc[2];    } result, *argp = (union XTunnelsSwap *)&arg;    result.uc[0] = argp->uc[1];    result.uc[1] = argp->uc[0];    return result.sv;#endif}static inline u_int32_t XTunnelsSwapInt32(u_int32_t arg) {#if defined(__i386__)    u_int32_t result;    __asm__ volatile("bswap %0" : "=r" (result) : "0" (arg));    return result;#elif defined(__ppc__) && defined(__GNUC__)    u_int32_t result;    __asm__ volatile("lwbrx %0, 0, %1" : "=r" (result) : "r" (&arg) : "r0");    return result;#elif 0    u_int32_t result;    result =	((arg<<24) & 0xFF000000) |		((arg<<8)  & 0x00FF0000) |		((arg>>8)  & 0x0000FF00) |		((arg>>24) & 0x000000FF);    return result;#else    union XTunnelsSwap {	u_int32_t sv;	u_int8_t uc[4];    } result, *argp = (union XTunnelsSwap *)&arg;    result.uc[0] = argp->uc[3];    result.uc[1] = argp->uc[2];    result.uc[2] = argp->uc[1];    result.uc[3] = argp->uc[0];    return result.sv;#endif}static inline u_int64_t XTunnelsSwapInt64(u_int64_t arg) {#if 0    u_int64_t result;    result =	((arg<<56) & 0xFF00000000000000ULL) |		((arg<<40) & 0x00FF000000000000ULL) |		((arg<<24) & 0x0000FF0000000000ULL) |		((arg<<8)  & 0x000000FF00000000ULL) |		((arg>>8)  & 0x00000000FF000000ULL) |		((arg>>24) & 0x0000000000FF0000ULL) |		((arg>>40) & 0x000000000000FF00ULL) |		((arg>>56) & 0x00000000000000FFULL);    return result;#else    union XTunnelsSwap {	u_int64_t sv;	u_int8_t uc[8];    } result, *argp = (union XTunnelsSwap *)&arg;    result.uc[0] = argp->uc[7];    result.uc[1] = argp->uc[6];    result.uc[2] = argp->uc[5];    result.uc[3] = argp->uc[4];    result.uc[4] = argp->uc[3];    result.uc[5] = argp->uc[2];    result.uc[6] = argp->uc[1];    result.uc[7] = argp->uc[0];    return result.sv;#endif}static inline u_int16_t XTunnelsSwapInt16BigToHost(u_int16_t arg) {#if defined(__BIG_ENDIAN__)    return arg;#else    return XTunnelsSwapInt16(arg);#endif}static inline u_int32_t XTunnelsSwapInt32BigToHost(u_int32_t arg) {#if defined(__BIG_ENDIAN__)    return arg;#else    return XTunnelsSwapInt32(arg);#endif}static inline u_int64_t XTunnelsSwapInt64BigToHost(u_int64_t arg) {#if defined(__BIG_ENDIAN__)    return arg;#else    return XTunnelsSwapInt64(arg);#endif}static inline u_int16_t XTunnelsSwapInt16HostToBig(u_int16_t arg) {#if defined(__BIG_ENDIAN__)    return arg;#else    return XTunnelsSwapInt16(arg);#endif}static inline u_int32_t XTunnelsSwapInt32HostToBig(u_int32_t arg) {#if defined(__BIG_ENDIAN__)    return arg;#else    return XTunnelsSwapInt32(arg);#endif}static inline u_int64_t XTunnelsSwapInt64HostToBig(u_int64_t arg) {#if defined(__BIG_ENDIAN__)    return arg;#else    return XTunnelsSwapInt64(arg);#endif}static inline u_int16_t XTunnelsSwapInt16LittleToHost(u_int16_t arg) {#if defined(__LITTLE_ENDIAN__)    return arg;#else    return XTunnelsSwapInt16(arg);#endif}static inline u_int32_t XTunnelsSwapInt32LittleToHost(u_int32_t arg) {#if defined(__LITTLE_ENDIAN__)    return arg;#else    return XTunnelsSwapInt32(arg);#endif}static inline u_int64_t XTunnelsSwapInt64LittleToHost(u_int64_t arg) {#if defined(__LITTLE_ENDIAN__)    return arg;#else    return XTunnelsSwapInt64(arg);#endif}static inline u_int16_t XTunnelsSwapInt16HostToLittle(u_int16_t arg) {#if defined(__LITTLE_ENDIAN__)    return arg;#else    return XTunnelsSwapInt16(arg);#endif}static inline u_int32_t XTunnelsSwapInt32HostToLittle(u_int32_t arg) {#if defined(__LITTLE_ENDIAN__)    return arg;#else    return XTunnelsSwapInt32(arg);#endif}static inline u_int64_t XTunnelsSwapInt64HostToLittle(u_int64_t arg) {#if defined(__LITTLE_ENDIAN__)    return arg;#else    return XTunnelsSwapInt64(arg);#endif}typedef struct {u_int32_t v;} XTunnelsSwappedFloat32;typedef struct {u_int64_t v;} XTunnelsSwappedFloat64;static inline XTunnelsSwappedFloat32 XTunnelsConvertFloat32HostToSwapped(float arg) {    union XTunnelsSwap {	float v;	XTunnelsSwappedFloat32 sv;    } result;    result.v = arg;#if defined(__LITTLE_ENDIAN__)    result.sv.v = XTunnelsSwapInt32(result.sv.v);#endif    return result.sv;}static inline float XTunnelsConvertFloat32SwappedToHost(XTunnelsSwappedFloat32 arg) {    union XTunnelsSwap {	float v;	XTunnelsSwappedFloat32 sv;    } result;    result.sv = arg;#if defined(__LITTLE_ENDIAN__)    result.sv.v = XTunnelsSwapInt32(result.sv.v);#endif    return result.v;}static inline XTunnelsSwappedFloat64 XTunnelsConvertFloat64HostToSwapped(double arg) {    union XTunnelsSwap {	double v;	XTunnelsSwappedFloat64 sv;    } result;    result.v = arg;#if defined(__LITTLE_ENDIAN__)    result.sv.v = XTunnelsSwapInt64(result.sv.v);#endif    return result.sv;}static inline double XTunnelsConvertFloat64SwappedToHost(XTunnelsSwappedFloat64 arg) {    union XTunnelsSwap {	double v;	XTunnelsSwappedFloat64 sv;    } result;    result.sv = arg;#if defined(__LITTLE_ENDIAN__)    result.sv.v = XTunnelsSwapInt64(result.sv.v);#endif    return result.v;}static inline XTunnelsSwappedFloat32 XTunnelsConvertFloatHostToSwapped(float arg) {    union XTunnelsSwap {	float v;	XTunnelsSwappedFloat32 sv;    } result;    result.v = arg;#if defined(__LITTLE_ENDIAN__)    result.sv.v = XTunnelsSwapInt32(result.sv.v);#endif    return result.sv;}static inline float XTunnelsConvertFloatSwappedToHost(XTunnelsSwappedFloat32 arg) {    union XTunnelsSwap {	float v;	XTunnelsSwappedFloat32 sv;    } result;    result.sv = arg;#if defined(__LITTLE_ENDIAN__)    result.sv.v = XTunnelsSwapInt32(result.sv.v);#endif    return result.v;}static inline XTunnelsSwappedFloat64 XTunnelsConvertDoubleHostToSwapped(double arg) {    union XTunnelsSwap {	double v;	XTunnelsSwappedFloat64 sv;    } result;    result.v = arg;#if defined(__LITTLE_ENDIAN__)    result.sv.v = XTunnelsSwapInt64(result.sv.v);#endif    return result.sv;}static inline double XTunnelsConvertDoubleSwappedToHost(XTunnelsSwappedFloat64 arg) {    union XTunnelsSwap {	double v;	XTunnelsSwappedFloat64 sv;    } result;    result.sv = arg;#if defined(__LITTLE_ENDIAN__)    result.sv.v = XTunnelsSwapInt64(result.sv.v);#endif    return result.v;}#if defined(__cplusplus)}#endif#endif // XTUNNELSBYTEORDER_H_2CB931C0_0F06_4705_86D3_782670C7C203

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -