关于大印度小印度字节序转换的问题

wildhorseych 2004-06-29 09:22:31
请教高手,关于大印度和小印度字节序转换的问题。
首先我来描述一下我的目的需求:
假如我想写一个函数,这个函数声明为这样的形式:
void BigIndiaToLittleIndia(const BYTE * bigIndiaStream,
const char * type,
BYTE *littleIndiaStream);
我的目的是想把某个类型的一个结构从BigInia字节序转换成LittleIndia字节序,
第一个参数就是需要转换的结构变量的字节流首地址,第二个参数是这个结构的类型(我不知道用const char *type来传这个参数是否合适),第三个就是转换后的这个结构变量的字节流。

就是说假如我有这么一个结构
typedef struct{
long x;
int y;
} A;
typedf struct{
A a;
char name[20];
}B;

现在我有B的一个实例
B b;
b.a.x=234;
b.a.y=2;
b.name="frank";
假如我想把b转换成littleindia字节序(默认为我当前系统使用BigIndia字节序)
我就可以调用上面定义的函数:
BYTE *b_out=new BYTE[sizeof(B)];
BigIndiaToLittleIndia((BYTE *)&b,"B",b_out);

问题是如何实现BigIndiaToLittleIndia这个函数????我考虑了一下似乎有些难度,就是说我解决不了这样一个问题,任意给定一个结构类型,我怎么确定它包含哪些元素,以及这些元素如果又是结构类型我怎么进一步分解,因为理论上只有基本类型才好做字节序直接转换。请高手指点!!!!!
...全文
211 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wildhorseych 2004-06-29
  • 打赏
  • 举报
回复
我有这样一个想法,拿出来欢迎大家拍砖!
可不可以定义一个模板类
templet <Class T> MyType{
public:
MyType(){littleIndiaStream=new BYTE[sizeof(T)]}
~MyType(){if(littleIndiaStream!=NULL) delete[] littleIndiaStream;}
BigIndiaToLittleIndia(int *length,BYTE *out);
pravite:
T t;
BYTE *littleIndiaStream;
}
templete <Class T> MyType::BigIndiaToLittleIndia()
{
//用RTTI得到t的类型信息,然后想办法把他们分解为基本类型,再做字节序转换
*length=sizeof(T)
memcpy(out,littleIndiaStream,sizeof(T))
}

问题的难点还是在于如何利用RTTI获得基本信息并分解为基本类型???
请熟悉RTTI高手指点,说说可行性以及具体方法。
wildhorseych 2004-06-29
  • 打赏
  • 举报
回复
如果这样的话,给每个数据结构用统一的格式来描述是不是也是一项很大的工作量啊?
关于你说的用RTTI来检查类型,问题是它可能只能达到自动判别某个结构变量类型的功能,而不能进一步区分这个变量的不同成员。
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
virual assistant和你的需求可能是两回事吧.

我的意思是对每个结构体,把结构的成员用统一的格式来描述它。比如
class CA
{
int i;
char sz[10];
};
那么我就用0表示是int,1表示char。 那么 整个格式就是0,1 10了。(假设而已)
在函数BigIndiaToLittleIndia中,通过RTTI来判定参数的类型。


/////////////////
但是如果你有千上万个数据结构的话,那可能就麻烦了。不过可以通过程序来转换数据格式。


wildhorseych 2004-06-29
  • 打赏
  • 举报
回复
peter9606(裴裴):问题是如何把一个大的结构解析成基本类型的2字节,四字节,八字节等等。

就是说我输入的是一个大的结构的字节流,要求输出就是这个结构的转换结果,如果如你所说,那基本上等于半手工,效率是不是太低了,如果有很多结构,我是不是都得手工把他们分解成基本类型然后再转换??
peter9606 2004-06-29
  • 打赏
  • 举报
回复
楼主
我做的项目是这样处理的
对于2字节长度 定义一个函数处理
对于4字节长度 定义一个函数处理
对于8字节长度 定义一个函数处理

不知道你想如何。当然咯 程序不是我写的,我肯定也想不出这么好的方法,给你点建议拉。
wildhorseych 2004-06-29
  • 打赏
  • 举报
回复
我认为如果普通的struct可以处理,那么union倒也不难,因为我们可以通过长度来确定union的成员到底是什么类型。
pacman2000 2004-06-29
  • 打赏
  • 举报
回复
问题: 假如是个union,怎么转得了啊!
wildhorseych 2004-06-29
  • 打赏
  • 举报
回复
qwertasdfg123(无名) :您好,能不能详细说一下你的想法?
rtdb(东临碣石):您好,问题是假如我在做一个porting的工作,有成千上万个数据需要都转换成littleIndia,难道就没有比较有效的办法么??难道真的要一个一个的进行转换??请赐教。

另外我记得virual assistant安装之后,它似乎能够找出一个数据类型的层次结构,所以我觉得理论上应该还是有办法的,你们怎么看?
rtdb 2004-06-29
  • 打赏
  • 举报
回复
个人认为是不可能做到转换“任意给定一个结构类型”的。
只能根据每个结构类型,为它配一个转换函数
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
做一个结构描述表,描述结构成员的类型,大小等。这样就可以确定结构的元素的相关属性。
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
// typeid 静态类型判定
// dynamic_cast 动态类型判定,用于多太,向下映射。

#include <iostream>
#include <typeinfo>

class CA
{
public:
virtual void foo(){}

};
class CB: virtual public CA
{
public:
virtual void foo1(){}
};

int main()
{
int i;
CA ca;
CA *pca = new CA;
CB *pcb = new CB;


std::cout<< typeid(i).name() << std::endl;
std::cout<< typeid(ca).name() << std::endl;
std::cout<< typeid(*pca).name() << std::endl;
std::cout<< typeid(*pcb).name() << std::endl;

if(typeid(i) == typeid(int))
std::cout<< "int" << std::endl;

if(typeid(ca) == typeid(CA))
std::cout<< "CA" << std::endl;

if(dynamic_cast<CB*>(pca) == pcb)
std::cout<< "CB" << std::endl;
delete pca;
delete pcb;
}
wildhorseych 2004-06-29
  • 打赏
  • 举报
回复
光是字节流当然不行,我的意思是说知道字节流并且知道代表哪中类型。
我的要求是设计一个函数能够对于任何一段给定了其代表的类型的字节流转换成另一种字节流方式。
例如:如果只有一个T t;那么我可以很简单的把它分解并转换字节序。但是如果有很多其他类型的变量难道我也要一个一个的分解并转换么?

能不能有个函数可以转换任意类型的字节序?
pacman2000 2004-06-29
  • 打赏
  • 举报
回复
同意楼上的,光是字节流是没有类型信息的。
riitso 2004-06-29
  • 打赏
  • 举报
回复
不可能识别!
如果你的数据源是字节流,比如文件的话。

比如,一个文件,内容是0x12 34 56 78
这到底是一个long,还是两个word,还是是4个byte?天知道!

所以,你一定要知道数据结构才能完成转换!
wildhorseych 2004-06-29
  • 打赏
  • 举报
回复
to:qwertasdfg123(无名)
你好,你的意思我基本上明白了。多谢你的答复,最后一个问题:
用RTTI来识别类型的具体做法是什么?
用typeid操作符?还是dynamic_cast?怎么用?给个简单的例子,马上把分给您,呵呵。
peter9606 2004-06-29
  • 打赏
  • 举报
回复
TO 楼主
那个东西也不是我设计的不意思
不过在我做的项目中,的确那东西的结构比较简单。
qwertasdfg123 2004-06-29
  • 打赏
  • 举报
回复
我是通过RTTI来识别类型,根据不同的类型在结构描述表查找相应的结构成员。
riitso 2004-06-29
  • 打赏
  • 举报
回复
原来你们管BIG_ENDIAN叫大印度

我认为在你不知道数据结构的前提下,不能完成转换工作!

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧