POCO中的数据类型和字节序

来源:互联网 发布:ugg淘宝代购 编辑:程序博客网 时间:2024/06/17 22:18
POCO中的数据类型和字节序


概要:固定长度的整数类型,字节序转换,和Any/DynamicAny类型
1、固定长度的整数类型
POCO定义了固定长度的整数类型
#include "Poco/Types.h"
(自动包含在 Poco/Foundation.h 中)
分别是Poco::Int8, Poco::Int16, Poco::Int32, Poco::Int64
Poco::UInt8, Poco::UInt16, Poco::UInt32, Poco::UInt64

注意Poco::IntPtr, Poco::UIntPtr与指针(32位或64位)长度相等的整形
对于嵌入式代码,如果你需要固定长度整数,请使用以上类型。
2、内建数据类型的长度
POCO有两个宏定义,用来定义long类型和指针类型的长度。
POCO_PTR_IS_64_BIT
这个宏定义了指针是64位的
POCO_LONG_IS_64_BIT
这个宏定义了long类型是64位的


3、字节序
POCO提供了处理字节序问题的工具,
根据当前主机的字节序预定义了宏
POCO_ARCH_LITTLE_ENDIAN
这个宏定义了低字节序
POCO_ARCH_BIG_ENDIAN
这个宏定义了高字节序
4、字节序转换
Poco::ByteOrder类提供了字节序转换的静态方法。
需要包含头文件 #include "Poco/ByteOrder.h"
对Int16, UInt16, Int32, UInt32, Int64 and UInt64,
IntXX flipBytes(IntXX value)
将数据类型从高字节序转换为低字节序,或者相反。


IntXX toBigEndian(IntXX value)
从主机字节序转换为高字节序
IntXX toLittleEndian(IntXX value)
从主机字节序转换为低字节序
IntXX fromBigEndian(IntXX value)
从高字节序转换为主机字节序


IntXX fromLittleEndian(IntXX value)
从低字节序转换为主机字节序


IntXX toNetwork(IntXX value)
从主机字节序转换为网络字节序


IntXX fromNetwork(IntXX value)
从网络字节序转换为主机字节序


记住,网络字节序是高字节序。
所有的转换函数都定义为inline函数,因此效率比较高。不必要的转换会在编译时被优化。
以下是示例
#include "Poco/ByteOrder.h"#include <iostream>using Poco::ByteOrder;using Poco::UInt16;int main(int argc, char** argv){#ifdef POCO_ARCH_LITTLE_ENDIANstd::cout << "little endian" << std::endl;#elsestd::cout << "big endian" << std::endl;#endifUInt16 port = 80;UInt16 networkPort = ByteOrder::toNetwork(port);return 0;}


三、Any类型


包含头文件 #include "Poco/Any.h"


Poco::Any类型可以容纳任何内建的或自定义的数据类型
Poco::Any类型支持以类型安全(type-safe)的方式提取数据。
要从中提取实际数据,就必须知道数据类型,这就会用到
Poco::AnyCast() 和 Poco::RefAnyCast() 函数模板。
程序示例:
#include "Poco/Any.h"#include "Poco/Exception.h"using Poco::Any;using Poco::AnyCast;using Poco::RefAnyCast;int main(int argc, char** argv){Any any(42);int i = AnyCast<int>(any); // okayint& ri = RefAnyCast<int>(any); // okaytry{short s = AnyCast<short>(any); // throws BadCastException}catch (Poco::BadCastException&){}return 0;}




四、DynamicAny类型


要包含头文件 #include "Poco/DynamicAny.h"
Poco::DynamicAny类型可以容纳以 DynamicAnyHolder 特殊化的任意类型数据。
Poco::DynamicAny 支持以类型安全的方式提取数据。
支持显式或隐式的类型转换(检查数据范围)。
DynamicAny: convert() 和 extract() 的比较
T convert();
void convert(T& val);
operator T ()
都返回一个复本,自动转换,比Any要慢。


const T& extract();
返回一个引用常量,不是自动转换,与Any一样块。


DynamicAny – 转换规则
数值型不能出现数据丢失
    小于0的数值不能被转换成无符号类型
    数值范围(二进制表示位数)不能在转换中变小
从整型到浮点型的精度丢失可以被允许
字符串合并可以被允许
程序示例:


#include "Poco/DynamicAny.h"#include "Poco/Exception.h"using Poco::DynamicAny;int main(int argc, char** argv){DynamicAny any(42);int i = any;std::string s(any.convert<std::string>());any.convert(s); // or without the need to castconst int& ri(any.extract<int>());short sh = any;try{short sh2 = any.extract<short>(); // throws BadCastException}catch (Poco::BadCastException&){}return 0;}



Any 和 DynamicAny 的比较


Any可以容纳任何类型,但你必须容纳数据的实际类型。
DynamicAny能够容纳DynamicAnyHolder特殊化的任何类型。
显式和隐式转换的应用限制在一些固定类型之间,包括常见类型和std::string.
0 0