进制、字节、字符、字符串

本文探讨了在UART和socket通讯中,数、字符和字符串的发送与接收方式,以及接收方如何处理字节数据。重点在于进制转换、字符编码和字符串解析,强调了四种基本的交互形式,并举例说明了不同发送方式对通讯的影响。
摘要由CSDN通过智能技术生成

二更

  对于发送方来说,要发送“a”这个字符,可以有三种方式:①直接发送字符“a”,比如串口调试助手直接输入“a”,Java中调用DataOutputStream的WriteBytes()方法;②按十六进制发送字符“a”对应的数值0x61,比如串口调试助手勾选“按十六进制发送”后输入“61”,Java中调用DataOutputStream的Write()方法;③发送字符“a”对应的十六进制数的数字字符,比如串口调试助手中直接输入“61”,Java中调用WriteBytes()方法。
  对于接收方来说,收到的是一整串二进制数,常见的是将这串二进制数按字节存储到byte类型数组(Java的socket应用中调用DataInputStream的read方法)、char类型数组(C)中。接下来,对这些数值的解析就取决于通信双方的约定了。举个例子,在项目的应用中,客户端发送的帧为字符串“DATA;”加上一个MODBUS帧“01 03 00 00 00 06 C5 C8”。那么发送时无法按照方式①发送,因为无法输入0x01对应的字符。按照方式②发送“44 41 54 41 3B 01 03 00 00 00 06 C5 C8”,接收时byte数组的值为“44 41 54 41 3B 01 03 00 00 00 06 C5 C8”。按照方式③发送“DATA;01 03 00 00 00 06 C5 C8”。接收方接收时byte数组为“44 41 54 41 3B 30 31 20 30 33 20 30 30 20 30 30 20 30 30 20 30 36 20 43 35 20 43 38”。
  接收方在处理收到的byte类型数组时有三种方式,以0x30这个数值为例:①直接作为数值进行运算(byteVal);②转化为String类型的字符“1”(char/string);②转化为String类型字符串“30”(byteString/multiByteString)。这三者之间的转化有12种关系(包括多个字节数值bytes、多个字符string和字节数值字符串multiByteString),但核心的是蓝色字体的四种,如下:
在这里插入图片描述

首更

  涉及通讯,比如UART,socket时,总是会接触到这四个概念。编程时经常在这上面出现BUG。现在整理归纳一下。

  首先是进制。一个数可以有不同的进制表示,常用的有二进制、十进制和十六进制。只要是数,就可以进行加减乘除、与或非和移位。进行加减乘除时,我们习惯用十进制来表示和计算;进行与或非和移位时我们更习惯用二进制来表示和计算。

  然后是字节。字节是计量单位,比如一个数是两个字节表示,那么意味这个数的范围可以是0-(216-1)或者-28-(28-1)。知道了字节,就知道数的范围。这就是字节提供的信息。

  然后是字符。字符是对数的翻译。字符和数之间的对应关系,常用的是ASCII码。也就是说ASCII码将数翻译成字符。可以看到字符的本质还是数。所以字符也可以进行运算,只是习惯上不这么做罢了。

  最后是字符串。字符串就是一个个字符。

  在UART和socket的通讯中,有发送接收字符字符串三种。更详细地讲,有发送接收一个数、一个字符、多个数和多个字符四种。

  发送和接收都是逐字节进行的,也就是一个字节一个字节地发送和接收。那么从数的角度看,就是每次发送和接收一个范围为0-127的数,再把这个数翻译成字符的话,就是每次发送和接收一个ASCII码。

  那么上面提到的四种类型的数据发送和接收就可以归纳为:发送一个数等价于发送一个字符,发送多个数等价于发送一串字符串。发送多个数时只要通过逐次移位一个字节把若干个数拼起来就可以了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值