这节没讲啥,就是演示了一下一字节一字节地遍历、两字节两字节地、四字节四字节地,与上节课的作业有些不同

先看一下本节课的举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"
char data[100] = {
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,
0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,
0x00,0x33,0x00,0x47,0x0C,0x0E,0x00,0x0D,0x00,0x11,
0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,
0x00,0x00,0x64,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,
0x00,0x02,0x74,0x0F,0x41,0x00,0x06,0x08,0x00,0x00,
0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,
0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00
};
//一字节
void Function1() {
char* p;
p = (char*)&data[0];
for (int i = 0; i < 100; i++) {
printf("%x\n", *(p+i));
}
}
//两字节
void Function2() {
short* p;
p = (short*)&data[0];
for (int i = 0; i < 50; i++) {
printf("%x\n", *(p+i));
}
}
//四字节
void Function3() {
int* p;
p = (int*)&data[0];
for (int i = 0; i < 25; i++) {
printf("%x\n", *(p+i));
}
}
int main(int argc, char* argv[]) {
Function1();
Function2();
Function3();
return 0;
}

以四字节的为例,关键的部分如下:

1
2
3
4
5
int* p;
p = (int*)&data[0];
for (int i = 0; i < 25; i++) {
printf("%x\n", *(p+i));
}

而上节课的作业是:

1
2
int* p = (int*)(data + i);
if (*p == num) printf("%x\n", p);

作业中需要我们做的是将每一个字节都视为可能的起始地址,去判断有没有符合的 int

课堂中的例子每次遍历的地址假设是 00 04 08...,那么作业中则需要是 00 01 02...

两者代码的关键差别就在于,一个 i 是加在 p 上的,一个 i 是加在 data 上的。data 是 char 类型,所以最终效果只是 +1,但是 p 是 int* 类型指针,最终效果就会是 +4