现在的位置: 首页 > 综合 > 正文

POCO: 类型和字节序

2013年08月21日 ⁄ 综合 ⁄ 共 2530字 ⁄ 字号 评论关闭

固定长度的整型,字节序转换,以及Any/DynamicAny类型

固定长度整型
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位)
跨平台的代码,建议使用这些固定长度的整型.
内置变量长度
POCO定义了两个宏来判断long和指针类型的长度:
POCO_PTR_IS_64_BIT   如果指针类型长度为64位,则将定义此宏
POCO_LONG_IS_64_BIT  如果long是64位,将定义此宏
字节序
Poco可以轻易处理好字节序的问题
使用以下宏定义来判断字节序:
POCO_ARCH_LITTLE_ENDIAN 如果是低字节序,将定义此宏
POCO_ARCH_BIG_ENDIAN 如果是高字节序,将定义此宏
字节序转换
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_ENDIAN
std::cout << "little endian" << std::endl;
#else
std::cout << "big endian" << std::endl;
#endif
UInt16 port = 80;
UInt16 networkPort = ByteOrder::toNetwork(port);
return 0;
}
Any类型
#include "Poco/Any.h"
Poco::Any可以处理所有的内置或用户定义的数据类型。
Poco::Any支持值语义
值可以以类型安全的方式提取
为便于数据转换,必须先知道值的数据类型
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); //正常
int& ri = RefAnyCast<int>(any); // 正常
try
{
short s = AnyCast<short>(any); // 抛BadCastException
}
catch (Poco::BadCastException&)
{
}
return 0;
}
DynamicAny类型
#include "Poco/DynamicAny.h"
Poco::DynamicAny可处理任何类型的值。(自定义类需从DynamicAnyHolder派生。)
Poco::DynamicAny支持值语义;
值可以以类型安全的方式提取;
可安全的在不同类型间转换(标准类型,std::string)。
DynamicAny: convert() 与 extract() 比较
T convert();
void convert(T& val);
operator T ()
返回一个复制对象
自动转换
比Any的转换要慢
const T& extract();
返回原对象的引用
不自动转换
与Any转换一样快
DynamicAny转换规则
  • 数值类型禁止转换规则:

    • 负数无法转换为无符号类型
    • 假设当前值需要x位,无法转换小于x位的类型。(比如,变量为2000,需要16位,无法转换为8位)
  • 整型到浮点类型的转换会丢失数据精度
  • 字符串到字符,允许转换并会被截断
#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 cast
const int& ri(any.extract<int>());
short s = any;
try
{
short s = any.extract<short>(); // throws BadCastException
}
catch (Poco::BadCastException&)
{
}
return 0;
}
Any与DynamicAny的区别
Any可以应对任何类型,但从Any取出数据时,必须知道原类型。
DynamicAny可以处理所有以DynamicAnyHolder规范的类型
只支持基础类型和std::string显式和隐式类型转换

抱歉!评论已关闭.