lenga 发表于 2015-7-23 07:54:22

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]
查看完整版本: redis源码笔记-endian