首页
社区
课程
招聘
[求助]谁知道 怎样将 整形 36 转换为 0x36
发表于: 2009-4-8 07:21 6876

[求助]谁知道 怎样将 整形 36 转换为 0x36

2009-4-8 07:21
6876
CopyMemory((LPVOID)(p+66A0),(LPCVOID)&data_ge,sizeof(DATA_GE));
我要把 66A0 变成 0x66A0...
CopyMemory((LPVOID)(p+0x66A0),(LPCVOID)&data_ge,sizeof(DATA_GE));
不知道怎么转换...
知道的..请告诉下..

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
2
我晕了...我觉得应该会是这样但觉得又不大可能那样...
2009-4-8 07:30
0
雪    币: 111
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不知道你用p + 66A0是出于什么目的,不过在c和c++里,指针相加是没有意义的,指针相减表示两个地址之间的单元个数。

比如有一个int数组          int iarray[10];
有一指针指向iarray[4]        int *p = &(iarray[4]);
那么 p - iarray 的结果为4.

而指针相加就没有任何意义。如果66A0是一个偏移,直接用十进制不久可以,为何要转换成16进制?最后36转换成0x36就是0x36,没有问题!
2009-4-8 09:30
0
雪    币: 111
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
#include <iostream>
using namespace std;

int main(){
  int iarray[15] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  int *p4 = iarray + 0x000A;

  cout << *p4 <<endl;
  cout << p4 - iarray << endl;
  return 0;
}

输出为:

11
10
2009-4-8 09:31
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
汗 没看清意思~
2009-4-8 11:38
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
6
楼上的做法是错误的,如果按楼上的这么做,那得到的结果将是36的十六进制 0x24,嘿嘿
下面给出一个我的做法:

int i = 1, n = 36;
int k = n /10;
while (k)  //求出n的长度
{
        i++;
        k = k /10;
}
char *p = new char[i+1];  //分配Len(n)+1的字串长度
ZeroMemory(p, i+1);
itoa(n, p, 10);    //将整数转化为字串
sscanf(p, "%x", &k);  //将字串转化为十六进制数
delete p;
//k就是转化后的十六进制整数,比如说是36,那么k=54(十进制)=36(十六进制)
2009-4-8 12:18
0
雪    币: 230
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢大家的回答
2009-4-8 12:33
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
8
  其实按照十六进制的算法来进行,效率可能更高一点,将 n = 36 直接转为 k = 3*16+6;
就行了。下面是另一种算法:
          int n = 36;
        int j = 0, k = 0;
        CString str;
        str.Format("%d", n);
        for(int i = str.GetLength(); i>0 ; i--)
        {
                k += atoi(str.Mid(j++, 1).GetBuffer(0))*pow(16, i-1);
        }
2009-4-8 12:57
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不需要先转字符串,再字符串到int吧,那样效率太低了...

实际上就是把一个16进制的数转换为10进制的数。

36 => 0x36 = 3*16 + 6
234=> 0x234 = 2*16*16 + 3 * 16 + 4

unsigned int Hex2Dec(int hex)
{
    unsigned int result = 0, power = 0;
    while( hex > 0 )
    {
        result += (hex % 10) << power;
        hex = hex/10;
        power += 4;
    }
    return result;
}
2009-4-8 13:03
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
10
引入CString类,再次简化:
        int n = 36;
        CString str;
        str.Format("%d", n);
        sscanf(str.GetBuffer(0), "%x", &n);    //4行代码搞定,效率也不错。n就是转化后的结果。
2009-4-8 13:05
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你这个只能说简化了写代码的效率,而不是简化了代码的执行效率哈
2009-4-8 13:08
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
12
  呵呵,以最简洁的方式写出代码,也是另一种效率吧
2009-4-8 13:11
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
呵呵,没有注意到你是在简化8楼的代码,以为你是说10楼的代码是9楼的简化。
2009-4-8 13:34
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
14
char buf[2];
int a=36;
ssprintf(buf,"%d",a);
sscanf(buf,"%x",&a);

variable a was converted from 36D to 36H now
2009-4-8 15:44
0
雪    币: 347
活跃值: (25)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
15
楼上方法不错,膜拜
2009-4-8 16:06
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
呵呵,这个帖子我全能看懂。
2009-4-8 17:51
0
雪    币: 230
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习了 ..嘿嘿
2009-4-8 21:21
0
雪    币: 230
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
[QUOTE=stalker;603523]char buf[2];
int a=36;
ssprintf(buf,"%d",a);
sscanf(buf,"%x",&a);

variable a was converted from 36D to 36H now...[/QUOTE]
学习了 不错..
2009-4-8 21:21
0
雪    币: 230
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
3Q ..
感谢你的帮助
2009-4-8 21:24
0
游客
登录 | 注册 方可回帖
返回
//