poco定义了固定字节大小的整数。
头文件:#include "Poco/Types.h" 在 #include " Poco/Foundation.h" 里面自定包含了Type头文件;
Poco::Int8, Poco::Int16 , Poco::Int32 , Poco::Int64
Poco::UInt8 , Poco::UInt16, Poco::UInt32, Poco::UInt64
Poco::IntPtr , Poco::UIntPtr针对于指针的大小(32位或者64位,与操作系统有关)
big-endian和litter-endian指的是读取存储时的数据解释方式。
它们只和多字节类型的数据有关,比如说int(4),short(4),long(4 }} 8)型,而对单字节数据byte却没有影响。
litter-endian:将低序字节存储在起始地址(低位字节存储在内存中低位地址)。
big-endian:将高序字节存储在起始地址(高位字节存储在内存中低位地址)。
其实就是在内存中存储位置不同,例如:int a = 0x01020304
在BIG-ENDIAN的情况下存放为:
字节号 0 1 2 3
数据 01 02 03 04
在LITTLE-ENDIAN的情况下存放为:
字节号 0 1 2 3
数据 04 03 02 01
主机序和网络序
主机序:是读取计算机内存数据时的解释方式,它和CPU、操作系统的类型相关,
分为litter-endian和big-endian。X86架构的cpu不管操作系统是NT还是UNIX系的,都是小字节序,
而PowerPC 、SPARC和Motorola处理器则很多是大字节序。
如果在两台字节序不同的主机之间进行网络通讯,大小字节序的问题就会出现。所以需要转换。
网络序始终是大字节序,所以通过网络传输时候都需要变为大字节序,然后从网络下载时候都需要变为
本地主机的字节序。
Poco函数:
1) IntXX flipBytes(IntXX value)
字节翻转排序,实现大小字节序的转换
2) IntXX toBigEndian(IntXX value)
把数据从本机序转成大字节序。如果本机序是本身就是大字节序,返回结果为转之前
数据。
3) IntXX toLittleEndian(IntXX value)
把数据从本机序转成小字节序。如果本机序是本身就是小字节序,返回结果为转之前
数据。
4) IntXX fromBigEndian(IntXX value)
把数据从大字节序转成本机序。如果本机序是本身就是大字节序,返回结果为转之前
数据。
5) IntXX fromLittleEndian(IntXX value)
把数据从小字节序转成本机序。如果本机序是本身就是小字节序,返回结果为转之前
数据。
6) IntXX toNetwork(IntXX value)
把数据从本机序转成网络序。如果本机序是本身就是大字节序,返回结果为转之前数
据。
7) IntXX fromNetwork(IntXX value)
把数据从网络序转成本机序。如果本机序是本身就是大字节序,返回结果为转之前数
据。
#include "Poco/ByteOrder.h"
#include
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;
std::cout << "本地字节序:" << port << std::endl;
UInt16 networkPort = ByteOrder::toNetwork(port);
std::cout <<"网络字节序:"<< networkPort << std::endl;
UInt16 nport = ByteOrder::fromNetwork(networkPort);
std::cout << "网络字转本地字节序:" << nport << std::endl;
UInt16 bigport = ByteOrder::toBigEndian(nport);
std::cout << "小字节转大字节字:" << bigport << std::endl;
getchar();
return 0;
}
#include
#include "Poco/Any.h"
#include "Poco/Exception.h"
#include
using Poco::Any;
using Poco::AnyCast;
using Poco::RefAnyCast;
int main(int argc, char** argv)
{
Any any(111);
int i = AnyCast(any); // okay
int& ri = RefAnyCast(any); // okay
try
{
short s = AnyCast(any); // throws BadCastException
assert(any.type() == typeid(int));
}
catch (Poco::BadCastException&e)
{
std::cout << e.what() << std::endl;
}
getchar();
return 0;
}