- 主题:C语言是怎么处理反射需求的?
10年前,打过擂。
我用映射技术,C里做不了反射 用映射代替。
DB2数据库,速度是对手的40倍。
【 在 mywindows 的大作中提到: 】
: 很多场合并不在乎这点性能损失
--
FROM 221.221.51.*
55楼的函数,他是一个库函数。就是说,他在编译时,还不知道递给他的是什么结构。
需要把全部或指定的成员,以“名字:值”的形式,转换成JSON格式。
这个程序要取成员名,和值。
【 在 il15 的大作中提到: 】
: 多谢!基本就用C,没用过其它语言...
: 然后不懂就继续问:能够举个简单的例子,说明一下“结构的成员类型,长度”有用的例子吗?
:
--
FROM 221.221.51.*
之前看了你的这个例子,不大明白,现在又去查了下 JSON(见笑,第一次知道这个),有点理解了。
不过也还是有点疑问,struct_to_JSON() 主要的应用是什么呢?
另外,能不能做个在struct 里面加个函数回调指针来做这个事情呢?
比如
typedef struct _StructCommon {
int (*myself_to_JSON) (...);
} StructCommon;
struct A {
StructCommon SC;
// other members of A;
}
struct B {
StructCommon SC;
// other members of B;
}
int struct_to_JSON(StructCommon *pSC){
pSC->myself_to_JSON(...);
}
【 在 ylh1969 的大作中提到: 】
: 55楼的函数,他是一个库函数。就是说,他在编译时,还不知道递给他的是什么结构。
: 需要把全部或指定的成员,以“名字:值”的形式,转换成JSON格式。
: 这个程序要取成员名,和值。
--
FROM 14.16.218.*
才看到你这个。如果是第三方软件那应该是不行了。
不过还是有那个疑问,就是这个结构在什么情形下要开放出来呢?
【 在 ylh1969 的大作中提到: 】
: 每个成员都标?
: 我可是针对普通结构,甚至是第三方软件的结构,改不得的。
--
FROM 14.16.218.*
第三方软件的用户接口函数,比如要传递一些数据进去,或结果出来。
【 在 il15 的大作中提到: 】
: 才看到你这个。如果是第三方软件那应该是不行了。
: 不过还是有那个疑问,就是这个结构在什么情形下要开放出来呢?
:
--
FROM 221.221.51.*
首先你得知道函数是干嘛的,输入参数都是啥东西,输出是啥,否则没法弄。
哪怕你用反射,你也得知道属性或者方法的名字,变量类型和个数吧。
不然给你一堆,你也不知道用哪个,怎么用。还是得一个个试。
如果啥都不知道,原则上也是可以弄的,就是工作量很大,
相当于你逆向整个状态机黑箱。实际当中只怕没人会真这么干。
反射只不过是提供了一种方式,把你逆向的工作量变小,方便干活而已。
【 在 ylh1969 的大作中提到: 】
: 55楼的函数怎么实现?
--
FROM 27.154.193.*
在网络间传递数据。结构数据基本没法传。一个原因是含有二进制信息,还有,不同系统和编译器,对相同的结构,布局并不相同,成员边界对齐方式不同。还有大小端的问题。那么,不同系统间互传信息,就需要序列化。JSON就是一种序列化方式、格式。
数据到达以后,还需要反序列化,把JSON转换回结构。那么,就需要另外一个函数:
JSON_to_struct(void *struct_p,JSON json);
序列化和反序列化,一对程序。
如果没有反射,那么,对于每一个结构,都要写一对程序。一个中型项目,处理百十来个结构是普普通通的。试想,百十来对程序。
还有对数据库的存取操作,这可是一大堆程序,那可就是百十来堆程序呀。
【 在 il15 的大作中提到: 】
: 之前看了你的这个例子,不大明白,现在又去查了下 JSON(见笑,第一次知道这个),有点理解了。
: 不过也还是有点疑问,struct_to_JSON() 主要的应用是什么呢?
: 另外,能不能做个在struct 里面加个函数回调指针来做这个事情呢?
: ...................
--
FROM 221.221.51.*
myself_to_JSON(),是个虚函数,被继承后要自己写的吧,100个结构就是100堆程序。
【 在 il15 的大作中提到: 】
: 之前看了你的这个例子,不大明白,现在又去查了下 JSON(见笑,第一次知道这个),有点理解了。
: 不过也还是有点疑问,struct_to_JSON() 主要的应用是什么呢?
: 另外,能不能做个在struct 里面加个函数回调指针来做这个事情呢?
: ...................
--
FROM 221.221.51.*
对。我们实际的函数,要加两个参数:结构说明书,或叫做TEMPLATE。选择器choose。
在TEMPLATE里告诉你每个成员的名字,类型,长度,位置。
choose: "名字,名字,名字",NULL取全部成员。。
【 在 gluon521 的大作中提到: 】
: 首先你得知道函数是干嘛的,输入参数都是啥东西,输出是啥,否则没法弄。
: 哪怕你用反射,你也得知道属性或者方法的名字,变量类型和个数吧。
: 不然给你一堆,你也不知道用哪个,怎么用。还是得一个个试。
: ...................
--
修改:ylh1969 FROM 221.221.51.*
FROM 221.221.51.*
看来你这问题略复杂,估计光靠问是没法得到结果的。
你得找个做逆向有经验的人帮你搞,这样快一点。
或者自己慢慢去摸索,如果不着急的话。
【 在 ylh1969 的大作中提到: 】
: 对。我们实际的函数,要加两个参数:结构说明书,或叫做TEMPLATE。选择器choose。
: 在TEMPLATE里告诉你每个成员的名字,类型,长度,位置。
: choose: "名字,名字,名字",NULL取全部成员。。
: ...................
--
FROM 27.154.193.*