redis源码笔记-endian
对于目标机是大端字节序的机器,进行字节码的转换,提供了16byte、32byte、64byte字节的转换。在intset\ziplist\zipmap三种数据结构中使用,使得不同字节序机器生成的rdb文件格式都是统一的(小端字节序),便于兼容。代码实在是太简单了,贴上来,不多说了。
endian.h
1 #ifndef __ENDIAN_H
2 #define __ENDIAN_H
3
4 void memrev16(void *p);
5 void memrev32(void *p);
6 void memrev64(void *p);
7
8 /* variants of the function doing the actual convertion only if the target
9* host is big endian */
10 #if (BYTE_ORDER == LITTLE_ENDIAN)
11 #define memrev16ifbe(p)
12 #define memrev32ifbe(p)
13 #define memrev64ifbe(p)
14 #else
15 #define memrev16ifbe(p) memrev16(p)
16 #define memrev32ifbe(p) memrev32(p)
17 #define memrev64ifbe(p) memrev64(p)
18 #endif
19
20 #endif
endian.c
1 /* Toggle the 16 bit unsigned integer pointed by *p from little endian to
2* big endian */
3 void memrev16(void *p) {
4 unsigned char *x = p, t;
5
6 t = x;
7 x = x;
8 x = t;
9 }
10
11 /* Toggle the 32 bit unsigned integer pointed by *p from little endian to
12* big endian */
13 void memrev32(void *p) {
14 unsigned char *x = p, t;
15
16 t = x;
17 x = x;
18 x = t;
19 t = x;
20 x = x;
21 x = t;
22 }
23
24 /* Toggle the 64 bit unsigned integer pointed by *p from little endian to
25* big endian */
26 void memrev64(void *p) {
27 unsigned char *x = p, t;
28
29 t = x;
30 x = x;
31 x = t;
32 t = x;
33 x = x;
34 x = t;
35 t = x;
36 x = x;
37 x = t;
38 t = x;
39 x = x;
40 x = t;
41 }
42
43 #ifdef TESTMAIN
44 #include
45
46 int main(void) {
47 char buf;
48
49 sprintf(buf,"ciaoroma");
50 memrev16(buf);
51 printf("%s\n", buf);
52
53 sprintf(buf,"ciaoroma");
54 memrev32(buf);
55 printf("%s\n", buf);
56
57 sprintf(buf,"ciaoroma");
58 memrev64(buf);
59 printf("%s\n", buf);
60
61 return 0;
62 }
63 #endif
页:
[1]