📄 xtunnelsbyteorder.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 + -