2012-07-24 76 views
0

我有以下代碼指針位移?

void PacketEncrypt(Packet* packet, int sizeofpacket) 
{ 
    int* pointer; 
    pointer = ((int*)packet+sizeofpacket)-2; 
    (int)*pointer = packet->PacketSize^0x1A3C; 
    packet->Type += 0x0FFF7; 
} 

問題是當我調試它,編譯器將其設置爲:

0041585E 8B45 0C   MOV EAX,DWORD PTR SS:[EBP+C] 
00415861 8B4D 08   MOV ECX,DWORD PTR SS:[EBP+8] 
00415864 8D5481 F8  LEA EDX,DWORD PTR DS:[ECX+EAX*4-8] 

但我真正想要的是:

0041585E 8B45 0C   MOV EAX,DWORD PTR SS:[EBP+C] 
00415861 8B4D 08   MOV ECX,DWORD PTR SS:[EBP+8] 
00415864 8D5481 F8  LEA EDX,DWORD PTR DS:[ECX+EAX-2] 

我是那種新到C++,所以你可以幫我解決我做錯了什麼,或者爲什麼編譯器添加標量* 4?謝謝 !

+0

因爲'int'在您的系統上的大小爲4個字節。 – Mysticial 2012-07-24 07:04:14

回答

1

int指針在您的機器上的大小爲4 bytes,並且只能移動4*n字節。如果你需要通過2 bytes將它轉換爲char移動指針,因爲sizeof(char) = 1

char *ptr = (char*)otherPtr; 
ptr += 2; //shift by 2 bytes 

int *ptr = (int*)otherPtr; 
ptr += 2; //shift by 8 bytes. (2 * sizeof(int)) 

編輯

(short*)pointer = something. - 你不能分配給rvalue。我想你的意思是:

pointer = (char*) something 

,或者您需要short指針:

short *someOtherPointer = something 
+0

感謝您的例子和答案! – ffenix 2012-07-24 07:09:38

+0

請確保選中其中一個給出的答案,因爲它們都是正確的。如果您需要進一步澄清,留下評論也是有用的。 – defube 2012-07-24 07:18:23

+0

我現在遇到以下問題: char * pointer; pointer =((char *)packet + sizeofpacket)-2; (short *)pointer = packet-> PacketSize^0x1A3C; 它說表達式必須是一個可修改的左值。我想要做的: WORD PTR [pointer] = packet-> PacketSize^0x1A3C 謝謝! – ffenix 2012-07-24 07:27:41

4

下,用指針類型++做指針運算。 ptr+2是2 元素,而不是過去ptr的兩個字節。如果,這兩個元素是8個字節,並且ptr+2因此將指向通過ptr的8個字節。

+0

感謝您的快速回答! – ffenix 2012-07-24 07:09:11