美文网首页
C的小工具库--JohnLib

C的小工具库--JohnLib

作者: JohnYuCN | 来源:发表于2021-10-22 18:47 被阅读0次

1. 有关大小端序,及二进制转换的工具集:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

/**
 * 短整型数的大小端序互换
 * 目前X86及ARM的默认是:小端序,如short m=1的形式:00000001 00000000 
 * 互换后:00000000 00000001
**/
short short_endian_change(short m){
    int len=(int)sizeof(m);
    char *mp=(char *)&m;
    mp+=(len-1);
    short n=0;
    char *np=(char *)&n;
    for(int i=0;i<len;i++){
        *(np++)=*(mp--);
    }
    return n;
}


/**
 * 整型数的大小端序互换
 * 目前X86及ARM的默认是:小端序,如int m=1的形式:00000001 0~共24个 
**/
int int_endian_change(int m){
    //获取待转换数的长度
    int len=(int)sizeof(m);
    //生成char指针,并指向到m的最后一个字节
    char *mp=(char *)&m;
    mp+=(len-1);
    // 生成一个新的整型数据,利用指针的移动完成数据的复制,最后返回新数
    int n=0;
    char *np=(char *)&n;
    for(int i=0;i<len;i++){
        *(np++)=*(mp--);
    }
    return n;
}


/**
 * 完成char类型数据的二进制序列生成
**/ 
char * char_bin(char x)
{
    static char s[9];
    int z;
    s[0]='\0';//利用strcat,会将数据插入到'\0'之前的机制
    //利用:1000 0000 的向右移动,再与数据的按位&操作,来判断当前位的1/0判断
    for (z = 128; z > 0; z >>= 1)
    {
        //根据当前位为的1、0追加生成字符串
        strcat(s, ((x & z) == z) ? "1" : "0");
    }
    return s;
}


/**
 * 完成short类型数据的二进制序列生成,本函数按大端序显示
 * short x 被转换的数据
 * char *sp 分隔符,如果不想使用,则传入“”即可
**/ 
char * short_bin(short x,char *sp)
{
    static char s[18];
    int z,index=1;
    s[0]='\0';
    for (z = 1<<15; z > 0; z >>= 1)
    {
        strcat(s, ((x & z) == z) ? "1" : "0");
        if(index%8==0 && index<15) strcat(s,sp);
        index++;
    }
    return s;
}
/**
 * 完成int类型数据的二进制序列生成,本函数按大端序显示
 * x 被转换的数据
 * char *sp 分隔符,如果不想使用,则传入“”即可
**/ 
char * int_bin(int x,char *sp)
{  
    static char s[36];
    unsigned int z; 
    int index=0;
    s[0]='\0';
    for (z = 1<<31; z > 0; z >>= 1)
    { 
        strcat(s, ((x & z) == z) ? "1" : "0");
        if((index+1)%8==0 && index<31) strcat(s,sp);
        index++;
    }
    return s;  
}

/**
 * 使用演示
**/
int main(int argc, char const *argv[])
{
    short m=1;
    short n=short_endian_change(1);
    
    char *s=short_bin(m,"<-高-低->");
    printf("%hd的大端序排列是:%s\n",m,s);
    s=short_bin(n,"<-低-高->");
    printf("%hd的小端序排列是:%s\n",m,s);

    int m1=258;
    int n1=int_endian_change(m1);
    s=int_bin(m1,"<-高-低->");
    printf("%d的大端序排列是:%s\n",m1,s);
    s=int_bin(n1,"<-低-高->");
    printf("%d的小端序排列是:%s\n",m1,s);

    return 0;
}


运行结果:

1的大端序排列是:00000000<-高-低->00000001
1的小端序排列是:00000001<-低-高->00000000
258的大端序排列是:00000000<-高-低->00000000<-高-低->00000001<-高-低->00000010
258的小端序排列是:00000010<-低-高->00000001<-低-高->00000000<-低-高->00000000

相关文章

网友评论

      本文标题:C的小工具库--JohnLib

      本文链接:https://www.haomeiwen.com/subject/nhrhaltx.html