很多朋友“字节序“和“bit序“分不清~(转载)

2023-05-16

转载自:很多朋友"字节序"和"bit序"分不清~

很多朋友"字节序"和"bit序"分不清~

嵌入式情报局  昨天

以下文章来源于最后一个bug ,作者bug菌

1、剖析字节序  

    1)对于字节序其实很多小伙伴应该都是非常熟悉了,平时大家也都叫它"大小端",不过也有一部分小伙伴可能只是简单的知道它的概念,并没有在实际的代码开发中去深入了解,作者这里详细解析一下这个问题,同时也为后面的bit序铺垫。

    2)既然叫"字节序",那么其描述的是字节的顺序问题,如果对于单个字节而言是没有字节序的概念的,然而对于多个字节的数据类型便会由于机器的差异在内存中的字节顺序排列也是存在不同的。那么我们在考虑代码的可移植性的时候就需要把其考虑进去!

    3)字节序也叫大小端模式,分别为:大端模式(Big-Endian)和小端模式(Little-Endian),简单的表述:大端模式-高字节存低地址;小端模式-高字节高地址;下面以四字节整形数据0x78563412为例子描述不同模式在内存中的分布情况:

图片

    有些小伙伴很容易产生这样的误区:平时用指针移动好像并没有发现这样的问题,怎么上图指针移动到一下地址数据就有差别了呢?原因在于平时大家使用指针++的时候下一个地址为sizeof(指针类型)处,而非上图的地址+1。

    这里作者也编写了一个简单的程序供大家参考:

#include <stdio.h>

#include <stdlib.h>

/*****************************************

 * Fuction:main

 * Author :(公众号:最后一个bug)

 ****************************************/

int main(int argc, char *argv[]) {

    printf("int_Size:%d\n",sizeof(int));

    int Val = 0x78563412;

    int *ptr_int = &Val;

    unsigned char *ptr_char = (unsigned char *)&Val;

    printf("ptr_int  Addr:0X%X\n",ptr_int);

    printf("ptr_char Addr:0X%X\n",ptr_char);



    printf("ptr_char + 0:0X%X = 0X%X\n",ptr_char + 0,*(ptr_char + 0));

    printf("ptr_char + 1:0X%X = 0X%X\n",ptr_char + 1,*(ptr_char + 1));

    printf("ptr_char + 2:0X%X = 0X%X\n",ptr_char + 2,*(ptr_char + 2));

    printf("ptr_char + 3:0X%X = 0X%X\n",ptr_char + 3,*(ptr_char + 3));



    //用于判断字节序

    if((*(ptr_char))== 0x12)

    {

        printf("Little_Endian\n");

    }

    else

    {

        printf("Big_Endian\n");

    }

    printf("公众号:最后一个bug!");

   return 0;

}

    下面是输出的结果,对于大端模式大家也可以参考上面的代码进行简单的测试。

图片

    4)对于我们目前的PC机大部分都是X86架构,基本上都为小端模式。而在嵌入式中芯片架构各异,大家开发的时候特别是数据的存储与读取问题(比如说共联体数据的访问)都需要注意一下,对于大小端比较敏感的算法大家也可以通过大小端的特点编写对应转化算法进行对应的处理。

2、剖析bit序  

    1 )对于字节序大家应该算是比较熟悉,而对于bit序可能有些小伙伴可能关心的并不是很多,一方面一般的寻址最小单位都是byte,另一方面现在库都封装得太好了,基本上给大家的接口都是操作字节这个层面的事情,如果一旦我们要深入到更加原始的信号可能部分小伙伴还需要学习相关的知识。

    2)我们都知道大部分的通信都是采用"0101...”这样的电平bit信号来进行传输的,那我们从发送方到接受方到底高位bit(MSB)先传还是低位bit(LSB)先传,这个就需要我们进行bit序的定义的。

图片

    3)比如说我们现在有需求需要用IO口模拟串口,或者IIC通信,那么我就势必需要去了解串口或者IIC通信的物理层数据发送格式,这时候的bit序就需要我们特别注意了,如下图所示UART通信的bit序和IIC的bit序刚好相反,这在我们进行模拟编程的时候是需要注意的。

图片

    有些小伙伴会问,平时我都不进行模拟这些通信,底层都跟我做好了,基本上我获得byte来使用就行了,这个不了解也没关系。作者觉得吧,这些并不是很难的知识点,大家能够学习到肯定对以后会多一种解决问题的思路,比如说我现在和其他的设备通信不上或者是通信异常,那我们又该如何排除问题呢?

    4)对于一般的网络通信,底层都会把bit序跟大家转换好,不过也会存在一些情况需要大家进行相应的bit序的转化,具体根据实际情况进行确定。这里最后再分享一个平时自己在使用的bit序转化的算法:(如下图所示)

图片

    算法参考代码如下:

#include <stdio.h>

#include <stdlib.h>

/*****************************************

 * Fuction:Bit_Inverter

 * Author :(公众号:最后一个bug)

 ****************************************/

unsigned char Bit_Inverter(unsigned char Val)

{

    Val = ((Val & 0xAA) >> 1) | ((Val & 0x55) << 1);

    Val = ((Val & 0xCC) >> 2) | ((Val & 0x33) << 2);

    Val = ((Val & 0xF0) >> 4) | ((Val & 0x0F) << 4);

    return Val;

}

/*****************************************

 * Fuction:main

 * Author :(公众号:最后一个bug)

 ****************************************/

int main(int argc, char *argv[]) {

    int i = 0;

    unsigned char test = 0x95;

    unsigned char str1[10] ={0};

    unsigned char str2[10] ={0};

    itoa(test, str1, 2);

    itoa(Bit_Inverter(test), str2, 2);

    printf("%s <---inv---> %s\n", str1,str2);

    printf("公众号:最后一个bug!");

    return 0;

}

    运行结果如下所示:

图片

3、最后小结  

    好了,今天的知识分享就在这里了,万丈高楼平地起,虽然这些小知识并不是那么高大上,不过个人经验来看:凡事都是一个量变到质变的过程,只要能够日积月累,必能厚积薄发!

素材来源:最后一个bug,版权归原作者所有~

最  后 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

很多朋友“字节序“和“bit序“分不清~(转载) 的相关文章

随机推荐

  • C++:C语言实现HTTP的GET和POST请求

    似乎写代码发HTTP请求需要自己把完整的协议帧写出来 xff1f 而不是单纯填个URL就行了 xff0c 那既然完整协议帧都写出来了 xff0c 那我直接TCP发不就可以了 xff1f 还是说不能这样 基本你百度搜 c 43 43 发送ht
  • 字符串连接函数strcat,这个可以好好用用

    字符串连接函数strcat xff0c 这个可以好好用用 C 43 43 xff1a C语言实现HTTP的GET和POST请求 方方和圆圆 博客园 C 43 43 编写的Linux下Http请求 c 43 43 httplinux 其它代码
  • HTTP 账号密码验证

    http请求带用户名和密码验证 wdk的博客 CSDN博客 url带用户名和密码 转载自 xff1a HTTP 账号密码验证 qq 25600055的专栏 CSDN博客 HTTP 账号 密码验证 173300598 2018 05 28 1
  • http authorization 基本认证

    转载自 xff1a http authorization 基本认证 szchenrong 博客园 http authorization 基本认证 http协议是无状态的 xff0c 浏览器和web服务器之间可以通过cookie来身份识别 桌
  • HTTP报文(这篇讲得比较详细)

    转载自 xff1a HTTP报文 逆心 博客园 之前写过一篇HTML报文 xff0c 但是感觉写完之后还是不懂 xff0c 最近终于有时间开始看 HTTP权威指南 xff0c 看完之后觉得还是比之前的理解更加深入了 xff0c 提取HTTP
  • libcurl可以发送http请求

    libcurl可以发送http请求 轻量级C 43 43 实现的httpserver和httpclient c 43 43 httpserver C 43 43 代码类资源 CSDN下载 转 libcurl库使用方法 xff0c 好长 xf
  • Http Get请求简单实例(C++)

    转载自 xff1a 掘金 https juejin cn post 6844903897161531400 Http Get请求简单实例 xff08 C 43 43 xff09 HTTP报文 HTTP请求报文 请求行 xff1a GET H
  • 纯C++实现的HTTP请求封装(POST/GET)

    转载自 xff1a 纯C 43 43 实现的HTTP请求封装 xff08 POST GET xff09 阳光柠檬 的技术笔记 CSDN博客 纯C 43 43 实现的HTTP请求封装 xff08 POST GET xff09 时间 2016
  • [转]www-authenticate认证过程浅析

    转载自 xff1a 转 www authenticate认证过程浅析 maoliran的博客 CSDN博客 转 www authenticate认证过程浅析 新一下的兰天 2016 07 06 18 22 20 18002 正在上传 重新上
  • http Digest认证计算方法整理

    摘要认证及实现HTTP digest authentication 简书 HTTP Basic和Digest认证介绍与计算 诸子流 博客园 不要不知道上面说的URI是什么意思啊 图解HTTP 第 8 章 确认访问用户身份的认证 简书 8 1
  • HTTP Basic和Digest认证介绍与计算

    转载自 xff1a HTTP Basic和Digest认证介绍与计算 诸子流 博客园 HTTP Basic和Digest认证介绍与计算 一 说明 web用户认证 xff0c 最开始是get提交 43 把用户名密码存放在客户端的cookie中
  • 一些十分有用的字符串相关的函数,在写串口解析,TCP HTTP通信时有用

    写串口TCP HTTP xff0c 这方面感受颇深 xff0c 也遇到不少对吧 写数据解析时的常用函数 在字符串中查找字符串 strstr 我觉得有了str很多解析写起来会轻松快很多 字符串合并函数 字符串连接函数strcat xff0c
  • http digest认证过程分析及例子(这个给出了提取函数)

    转载自 xff1a http digest认证过程分析及例子 希哈科技的博客 CSDN博客 http digest认证过程分析及例子 技术标签 xff1a http digest 认证 验证过程 xff1a 步骤一 客户端向服务器申请数据
  • HTTP认证之摘要认证——Digest(一)

    转载自 xff1a HTTP认证之摘要认证 Digest xff08 一 xff09 xiaoxiaotank 博客园 本认证 Basic xff08 一 xff09 HTTP认证之基本认证 Basic xff08 二 xff09 HTTP
  • ubuntu 通过脚本使用firefox浏览器批量快速打开网页

    转载自 xff1a ubuntu 通过脚本使用firefox浏览器批量快速打开网页 行走的思想 博客园 ubuntu 通过脚本使用firefox浏览器批量快速打开网页 需求 xff1a 有一批url链接在excel表格里面 xff0c 想批
  • Linux命令发送Http GET/POST请求

    转载自 xff1a Linux命令发送Http GET POST请求 kaleidoscopic 博客园 Linux命令发送Http GET POST请求 Get请求 curl命令模拟Get请求 xff1a 1 使用curl命令 xff1a
  • curl命令使用digest方式验证用户

    没想到curl还真的可以用digest 转载自 xff1a curl命令使用digest方式验证用户 ZPDEV curl命令使用digest方式验证用户 发表于 2016 09 18 分类于 技术 本文作者 xff1a 周志平本文链接 x
  • 关于海康摄像头的摘要认证(转载)

    转载自 xff1a 关于海康摄像头的摘要认证 y673533511的博客 CSDN博客 关于海康 摄像头的摘要认证 y673533511 2019 03 11 10 30 01 4132 正在上传 重新上传取消 收藏 6 版权 最近在做一个
  • printf打印字符串的时候可以printf(“%s“,buf);buf可以是字符串名或者指针

    printf打印字符串的时候可以printf 34 s 34 buf buf可以是字符串名或者指针 比如buf可以是 char buf 10 也可以是 char buf 10
  • 很多朋友“字节序“和“bit序“分不清~(转载)

    转载自 xff1a 很多朋友 34 字节序 34 和 34 bit序 34 分不清 很多朋友 34 字节序 34 和 34 bit序 34 分不清 嵌入式情报局 昨天 以下文章来源于最后一个bug xff0c 作者bug菌 1 剖析字节序