Poco类型和字节序

一  poco类型

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位,与操作系统有关)


二 poco的字节序


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 <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;
	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;
}


二 poco的Any

  Poco中的Any类,来自于Boost库中的Any类。Any类主要用于数据库读取时的数据保存和解析。它能够将任意类型值保存进去,并能把任意类型

值读出来。

例子:

#include<iostream>
#include "Poco/Any.h"  
#include "Poco/Exception.h"  
#include <assert.h>  

using Poco::Any;
using Poco::AnyCast;
using Poco::RefAnyCast;

int main(int argc, char** argv)
{
	Any any(111);
	int i = AnyCast<int>(any);              // okay  
	int& ri = RefAnyCast<int>(any);         // okay  
	try
	{
		short s = AnyCast<short>(any);  // throws BadCastException  
		assert(any.type() == typeid(int));
	}
	catch (Poco::BadCastException&e)
	{
		std::cout << e.what() << std::endl;
	}
	getchar();
	return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值