【学习笔记】字节数据和字节字符串(b“ “)那些事

news2024/10/5 14:09:12

文章目录

  • 0 前言
  • 1 先来看看C语言中怎么处理这种字节数据
    • 1.1 使用总结
  • 2 再来看看Python当中是怎么处理字节数据的

0 前言

  最近在尝试用PyQt做一个上位机,遇到很多关于字节字符串的问题,这里简单总结几个关键点。

1 先来看看C语言中怎么处理这种字节数据

  玩嵌入式模块的应该知道,那种带字库的LCD模块,它里面的字库实际上编码方式就是GBK或者是GB2312,所谓“字库”,实际上就是一种字符编码和字符显示的像素编码的映射,这样在显示某个字符时,就不需要设置这个字符对应的显示像素,只需要传输这个字符对应的字库编码即可,代码编写方便很多。

  所以在这种带字库的LCD显示设备当中,如果需要显示某个字符,只需要将需要显示的字符用对应的编码格式(前面提到的GBK或GB2312)进行编码。但是实际在写代码时,好像没有专门编码的步骤?

  是的,这就引出了第一个问题:C语言怎么限定字符的编码方式, 复杂的函数不太清楚,这里提一个最简单也是最容易被忽略的点——C语言文本文件的编码方式。 不信可以在显示带字库LCD项目中,把显示部分的代码文件用utf8格式重新保存,这个时候显示大概率会变成乱码。

  再说一个可以佐证的例子。在VS Code中新建一个文件(默认是utf8格式的),输入以下代码:

#include "stdio.h"
#include "string.h"

char s[] = "中文";

int main()
{
    printf("中文");
    printf("%d", strlen(s));
    return 0;
}

然后再运行代码。如果终端使用的是powershell(5.x 或 7.x版本均可),那么大概率会输出乱码,因为powershell默认的编码方式是GBK,显示输出的UTF-8字符串当然是乱码了。

  然后在右下角点击UTF-8,选择通过编码保存,选择GB2312格式,然后在重新运行,此时就会发现,终端就没有乱码了,因为输出的编码格式和终端的编码方式对上了。

  总结来说,在C/C++中,程序输出(不管是输出到终端还是串口之类的)的字符串编码格式是和文件的编码方式直接挂钩的。

1.1 使用总结

  那一般是怎么使用呢?这里还是以嵌入式中常用的串口输出为例。

  首先我们要知道什么是字节数据。众所周知,在数据的传输过程中,是不可能直接传输我们人类能够识别的字符的,所有的内容都需要进行编码成二进制数据再进行传输,当然,一般是用十六进制表示,本质是一样的。8位二进制为一个字节。

  因此就存在字符和字节数据的映射关系了,比如说规定“我”这个字符对应的二进制(十六进制为)0x01(随便的例子),那么当需要传输“我”这个字符时,那就需要传递0x01这个字节数据,此即编码。然后接收方收到这个字节数据,也按照同样的映射关系把“我”从0x01当中提取出来,此即解码。所以关键点就是两者需要使用相同的映射关系,此即编码方式,如UTF8,UTF16等等。

  在C语言当中,数据的传输说实话非常随意。这个也可能是C语言设计的机制。举个例子,如果我想要传输“A”这个字符,我可以 直接传输这个字符'A' ,那么它在传输过程中会被自动按照文件编码方式编码成对应的字节数据;也可以 传输这个字符对应的数值 ,不管是二进制,十进制,十六进制都是可以的。同样,在进行运算的过程当中,字符也是可以直接作为数值进行运算的,取的就是其对应的编码值,即ASCII。

  总结来说,C语言当中进行数据传输时,会非常随意,可以说没有字节数据这种概念,因为它基本可以视为就是数值,如果是在编码范围内的,也可以转换为(char()) 需要显示的字符串。

这样的设计的好处就在于传输的字节数据和显示用的字符串基本没有差别了,char可以直接运算,int数值也可以直接以字符的形式输出到终端。但是坏处可能就是太灵活,同时编码方式会受限于文本文件的编码格式。

2 再来看看Python当中是怎么处理字节数据的

  相比于C语言当中的简单直接,Python在这部分比较复杂。最关键的就是它新增了字节字符串这个东西。

  首先需要清楚,字节字符串本身并不是真正的字节数据,它只是一个字节数据的呈现而已,因为按照C语言中的设定,字符和字节都可以视为数值,但在python当中就不行:

在这里插入图片描述
也就是不能直接通过int去转换,因为它本身并不是数值。

  • 字节字符串取值

  那如果我就是想要取这些字节字符串中的数值怎么办?用下标去索引!

在这里插入图片描述
从这里可以看出,用下标索引字节字符串得到的实际上就是int类型的数据了,其实就是默认为无符号整数,如果是0xff,那输出的就是255.

  上面这个是读取每个字节,那如果传输的数据是两个字节组合起来的,目标是这两个字节表示的数据,怎么办呢?这里要使用到int类中的from_bytes函数:

在这里插入图片描述

需要注意的是,字节字符串索引一个元素得到的是一个整形值 (a[0]),如果是索引多个 (a[0:3])或看似索引多个 (a[0:1]) 得到的还是字节字符串

int.from_bytes这个函数的作用就是将一个字节字符串转换为整形数值,且支持多个字节。还可以指定大端模式或小端模式,和是否设置为符号整数(上面那种取一个元素的情况默认是无符号整数)。

  • 字节字符串显示

  除了上面说从字节字符串中取出数值进行运算外,还有就是怎么将字节字符串转换为可显示的字符串。

在这里插入图片描述

这是最常用的encodedecode函数,但是需要注意的是,如果print里面是字节类型的数据(byte)的话,那么显示出来的并不是实际的整数,而是字节数据的具象化:字节字符串。

  这里还有一个需要注意的点,那就是第二个参数ignore,表示出现错误(一般是找不到该编码方式当中字节数据对应的字符)时要采取的方案,主要有三种选择:

  • restrict或不填:表示一旦出现没有对应字符的字节,直接报错
  • ignore: 表示出现没有对应字符的字节,直接忽略,看下一个,也不输出
  • replace: 表示出现没有对应字符的字节,用一个“?”字符代替

  那除了编码和解码,还有其他方式可以显示字节数据吗?比如很多串口调试助手当中显示的内容就是去掉0x后的字符,比如显示0xAF这个字节数据,就显示AF字符串,这种是咋实现的呢?实际上用的是字节字符串的一个函数hex

在这里插入图片描述

不过需要注意的是,hex函数也可以单独使用,它的作用是将一个整形转换为十六进制格式并以字符串的格式输出:

在这里插入图片描述

  最后,还有一种,就是使用repr函数把字节字符串的所有内容,包括\, x等字符都具象出来,这种可能使用得比较少。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3568平台开发系列讲解(Linux系统篇)共享内存的创建和映射过程

🚀返回专栏总目录 文章目录 一、共享内存的创建和映射过程流程梳理二、如何创建共享内存?三、如何将共享内存映射到虚拟地址空间?沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们一起学习下共享内存的创建和映射过程。 一、共享内存的创建和映射过程流程梳…

推荐5款重度电脑用户也未必知道的小众软件

作为一个重度电脑用户,你可能会经常使用一些软件来完成各种任务和娱乐。但是你知道有哪些好用的WIN10软件吗?今天我就为你介绍一下我推荐的五款WIN10软件,它们分别是: 1.反恶意软件——Malwarebytes Malwarebytes是一款专业的反…

AOP与SpringBoot使用AOP实例

AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实就是面向特定方法编程。 动态代理是面向切面编程最主流的实现。而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过…

浅谈thrift协议+举例通用mockserver如何实现

目录 简单来说: 举个例子: 简单来说: 1)是一个跨平台跨语言的通信协议,定义和创建跨语言服务,是一个高性能、轻量级RPC框架。 2)开发者无需关注不同语言/相同语言服务间如何通信,…

基于html+css的图片展示15

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

什么是Python?

目录 Python简介 Python发展史 Python优点与缺点 Python现如今的应用领域 总结 Python简介 Python是一种高级、解释型、面向对象的动态编程语言,由Guido van Rossum在1989年创建,首次发布于1991年。 Python设计的哲学是优雅、清晰、简单&#xff0c…

Windows逆向安全(一)之基础知识(八)

if else嵌套 这次来研究if else嵌套在汇编中的表现形式,本次以获取三个数中最大的数这个函数为例子,分析if else的汇编形式 求三个数中的最大值 首先贴上代码: #include "stdafx.h"int result0; int getMax(int i,int j,int k)…

机器视觉工程师必须知道机器视觉精度要思考哪些

​在和客户交流项目技术要求,这个项目,我要求的精度是0.01mm? 第一个问题:什么是精度? 精度要求0.01mm: 1.视觉重复性极差?静态?动态? 2.视觉与第三方相关性差异?极差?相关性系数? 3.整体系统误差?机械重复性误差? 4.产品尺寸公差? 第二个问题:精度与公差…

完美解决丨TypeError: fun() takes 2 positional arguments but 3 were given

python def fun(a, b): return a b c fun(1, 2, 3) Traceback (most recent call last): File "test.py", line 5, in <module c fun(1, 2, 3) TypeError: fun() takes 2 positional arguments but 3 were given 上面的代码中&#xff0c; fun 函数定义了两…

最通俗的语言解释01背包问题(力扣416题javascript版本)

【声明】以下内容参考了代码随想录&#xff0c;不用作商业用途~ 先来看一个场景&#xff1a;有N件物品&#xff0c;背包最大的重量为W&#xff0c;第i件物品的重量为weight[i]&#xff0c;得到的价值为value[i]&#xff0c;每件物品只用一次&#xff08;即不能重复放进背包&…

【计算方法】正交区域查询---KD-Tree概念

一、说明 kd 树是一种二叉树数据结构&#xff0c;可以用来进行高效的 kNN 计算。kd 树算法偏于复杂&#xff0c;本篇将先介绍以二叉树的形式来记录和索引空间的思路&#xff0c;以便读者更轻松地理解 kd 树。 二、正交区域查找 2.1 定义 对于k维空间的张量数据表格&#xff0…

Unity RenderStreaming 云渲染3.1.0-exp.6 食用手册

Unity云渲染 &#x1f957;资源&#x1f364;兼容性&#x1f367;手机端连接&#x1f969;安装方法&#x1f35b;IP端口设置&#x1f371;官方案例尝鲜&#x1f332;导入案例&#x1f332;添加场景&#x1f332;启动WebApp&#x1f332;打开Menu场景&#x1f332;连接参数设置&…

300左右蓝牙耳机推荐哪个好?300元左右最好的蓝牙耳机

蓝牙耳机如今在我们的生活中太普遍了&#xff0c;记得疫情刚开始天天要戴口罩&#xff0c;口罩的绳子和耳机线相缠十分的不方便&#xff0c;所以更多的人选择蓝牙耳机&#xff0c;下面整理了几款300元左右的蓝牙耳机品牌。 一、南卡小音舱Lite2蓝牙耳机 售价&#xff08;&…

4-数据结构

数据结构&#xff08;data structure&#xff09; 1. 简介 数据结构是在计算机中组织与存储数据的方式 如果想要表示“一排数字”&#xff0c;自然想到使用「数组」数据结构 数组的存储方式可以表示数字的相邻关系、顺序关系&#xff0c;但至于其中存储的是整数int&#xff0c…

【数据结构:线性表】顺序表

⚡线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直…

网络请求实战-RESTFUL约定和Postman工具

RESTFUL协议 表现层状态转化&#xff08;Representational state transfer&#xff09; 资源、表示和转换 资源&#xff08;Resource&#xff09; 服务端的一个资源 拥有URL 表示&#xff08;Representation&#xff09; 服务端的资源在客户端的表示 客户端拥有操作服务…

three.js之scene

THREE.Scene对象有时被称为场景图&#xff0c;可以用来保存所有图形场景的必要信息。在Three.js中&#xff0c;这意味着THREE.Scene保存所有对象、光源和渲染所需的其他对象。 本节主要是构建一个基本场景&#xff0c;然后可以通过gui添加&#xff0c;删除场景里的对象等。 效果…

lua变量、数据类型、if判断条件和数据结构table以及【lua 函数】

一、lua变量【 全局变量和局部变量和表中的域】 Lua 变量有三种类型&#xff1a;全局变量和局部变量和表中的域。 ▪ 全局变量&#xff1a;默认情况下&#xff0c;Lua中所有的变量都是全局变量。 ▪ 局部变量&#xff1a;使用local 显式声明在函数内的变量&#xff0c;以及函数…

Golang每日一练(leetDay0040)

目录 118. 杨辉三角 Pascals Triangle &#x1f31f; 119. 杨辉三角 II Pascals Triangle II &#x1f31f; 120. 三角形最小路径和 Triangle &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/…

港联证券策略:A股市场短期预计将保持区间震荡

港联证券以为&#xff0c;跟着4月30日的接近&#xff0c;一切板块的年报以及一季度报将进入密布发表期。从历史数据来看&#xff0c;4月中旬今后指数震动调整的概率较大&#xff0c;在操作上需注意操控全体仓位。从板块方面看&#xff0c;近期为数字经济和中特估双主线驱动的行…