c++是型別不安全的,一般位元組流和結構體是可以互相強轉的,但前提是位元組流要像結構體一樣進行資料對齊,下面就來看看按資料大小依次排列的位元組流是如何轉化為結構體的:
基礎依賴部分**:
#include #include #include namespace sangame
tdata8;
typedef uniontdata16;
typedef uniontdata32;
typedef uniontdata64;
#pragma pack(pop)
}namespace sangame
/** 測試該系統是否是 little endian 編碼
* @return 如果是返回true,否則false
*/inline bool islittleendian()
}}namespace sangame;
////網路資料 <-----> 主機資料 相互轉換
///*
* 網路轉主機
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::uint8_t ntoh8(sangame::uint8_t val)
/** 網路轉主機
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::uint16_t ntoh16(sangame::uint16_t val)
/** 網路轉主機
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::uint32_t ntoh32(sangame::uint32_t val)
/** 網路轉主機
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::uint64_t ntoh64(sangame::uint64_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::uint8_t hton8(sangame::uint8_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::uint16_t hton16(sangame::uint16_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::uint32_t hton32(sangame::uint32_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::uint64_t hton64(sangame::uint64_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::int8_t ntoh8(sangame::int8_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::int16_t ntoh16(sangame::int16_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::int32_t ntoh32(sangame::int32_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::int64_t ntoh64(sangame::int64_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::int8_t hton8(sangame::int8_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::int16_t hton16(sangame::int16_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::int32_t hton32(sangame::int32_t val)
/** 主機轉網路
* @param[in] val 要轉換的值
* @return 返回轉換後的值
*/inline sangame::int64_t hton64(sangame::int64_t val)
inline float64 hton64(float64 val)
inline float64 ntoh64(float64 val)
inline float32 hton32(float32 val)
inline float32 ntoh32(float32 val)
}}
位元組流轉化為結構體:
sangame::int8_t cfieldbase::readint8(char z)
sangame::int16_t cfieldbase::readint16(char z[2])
sangame::int32_t cfieldbase::readint32(char z[4])
sangame::int64_t cfieldbase::readint64(char z[8])
sangame::uint8_t cfieldbase::readuint8(char z)
sangame::uint16_t cfieldbase::readuint16(char z[2])
sangame::uint32_t cfieldbase::readuint32(char z[4])
sangame::uint64_t cfieldbase::readuint64(char z[8])
sangame::float32 cfieldbase::readfloat32(char z[4])
sangame::float64 cfieldbase::readfloat64(char z[8])
結構體轉為位元組流:
void cfieldbase::writeint8( const sangame::int8_t val ,void* bufsend,int& len)
void cfieldbase::writeint16( const sangame::int16_t val ,void* bufsend,int& len)
void cfieldbase::writeint32( const sangame::int32_t val ,void* bufsend,int& len)
void cfieldbase::writeint64( const sangame::int64_t val ,void* bufsend,int& len)
void cfieldbase::writeuint8( const sangame::uint8_t val,void* bufsend,int& len)
void cfieldbase::writeuint16( const sangame::uint16_t val,void* bufsend ,int& len)
void cfieldbase::writeuint32( const sangame::uint32_t val,void* bufsend,int& len)
void cfieldbase::writeuint64( const sangame::uint64_t val,void* bufsend,int& len)
void cfieldbase::writefloat64( const float64 val,void* bufsend,int& len )
}
c 結構體和位元組流之間的相互轉換
結構體轉byte陣列 1 首先要明白 是 在那個命名空間下 system.runtime.interopservices 2 首先得到結構體的大小 2 開闢相應的記憶體空間 3 將結構體填充進開闢的記憶體空間 4 從記憶體空間拷貝進byte陣列 5 不要忘記釋放記憶體哦 public static ...
C 中結構體與位元組流互相轉換
在c 中的結構體不能定義指標,不能定義字元陣列,只能在裡面定義字元陣列的引用。c 的訊息結構體如下 訊息格式 4 16 4 4 28個位元組 struct cs message c 定義的結構體如下 structlayout layoutkind.sequential,pack 1 public s...
C 中 結 構 體 與 字 節 流 互 相 轉 換
一 c 結構體 1 定義與c 對應的c 結構體 在c 中的結構體不能定義指標,不能定義字元陣列,只能在裡面定義字元陣列的引用。c 的訊息結構體如下 訊息格式 4 16 4 4 28個位元組 struct cs message c 定義的結構體如下 structlayout layoutkind.se...