• 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[0];
     7     x[0] = x[1];
     8     x[1] = 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[0];
    17     x[0] = x[3];
    18     x[3] = t;
    19     t = x[1];
    20     x[1] = x[2];
    21     x[2] = 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[0];
    30     x[0] = x[7];
    31     x[7] = t;
    32     t = x[1];
    33     x[1] = x[6];
    34     x[6] = t;
    35     t = x[2];
    36     x[2] = x[5];
    37     x[5] = t;
    38     t = x[3];
    39     x[3] = x[4];
    40     x[4] = t;
    41 }
    42 
    43 #ifdef TESTMAIN
    44 #include <stdio.h>
    45 
    46 int main(void) {
    47     char buf[32];
    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
  • 相关阅读:
    混合现实开发教程unity2017
    Intro to Airplane Physics in Unity 3D – 2017 and 2018
    Unity Awards 2018最佳资源
    ambiguous
    Unity2018.3全新Prefab预制件系统深入介绍视频教程+PPT+Demo源码
    Android Studio 集成开发工具教学视频 + 项目实战安卓多SDK接入与集成
    Unity下一轮最大的变革-Entity Component System & C# Jobs System
    使用unity开发游戏时如觉得游戏声音太吵,点Mute Audio
    SQL Delta实用案例介绍
    经典批处理实现自动关机(BAT)
  • 原文地址:https://www.cnblogs.com/liuhao/p/2497609.html
Copyright © 2020-2023  润新知