字符流与字节流的相互转换原理及代码(LinuxC)
⽂章⽬录
  我们在做项⽬时,常常会遇到将字节流的数据转成字符流,或者将字符流的数据转为字节流,例如最近做的⼀个项⽬,其中⼀个模块是使⽤移远的EC20 4G模块通过串⼝编程实现中英⽂短信的发送与接收,其中:
1. 在中⽂短信的发送时,要进⾏PDU的编码,其中包括了utf-8转unicode的处理,获取到的是字节流的unicode编码,但PDU格式是要
求给串⼝发送字符流的数据,所以会使⽤的字节流转换为字符流的相关操作
2. 在获取模块接收到的短信时,获取到的是⼀个字符流形式的unicode编码,编码我们是读不出来任何短信内容的,所以这是需要将
数字转unicode编码unicode编码转为utf-8的编码才能打印并获取到短信内容,就需要在转码之前,将字符流的unicode编码转为字节流,因为字符流其本质是保存了相应字符的ASCII码值,并不能⽤来进⾏转码
下⾯就来看是是转换的原理和代码吧~
⼀. 两者的区别
1. 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
2. 字节流默认不使⽤缓冲区;字符流使⽤缓冲区。
3. 字节流通常⽤于处理⼆进制数据,实际上它可以处理任意类型的数据,但它不⽀持直接写⼊或读取Unicode码元;字符流通常处理⽂
本数据,它⽀持写⼊及读取Unicode码元。
4. 底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进⾏写⼊。字符流是字节流的包装,字符流
则是直接接受字符串,它内部将串转成字节,再写⼊底层设备,这为我们向IO设别写⼊或读取字符串提供了⼀点点⽅便。
⼆. 还需要了解
通过ASCII码对照表我们可以知道,要想获取到数值对应字符(如0x0a 对应的是字符‘0’ 和字符 ‘a’),
以及反过来的字符对应的数值(如字符‘9’的数值是0x39),需要进⾏相关的加减法,还需要注意的是,字符’0’~‘9’后是7个符号,之后才是字符’A’~‘Z’,
三. 字节流转字符流实现
每个字节流数据都对应了两个字符就数据,如0xfe 对应了字符 ’ f ‘,’ e '.
* */
void Hex2Str(const char*source,int source_len,char*dest)
{
int      i;
unsigned char    HighByte;//保存⾼位
unsigned char    LowByte;//保存低位
for(i=0; i<source_len; i++)
{
HighByte = source[i]>>4;//获取⼀个字节数据的⾼4位
LowByte = source[i]&0x0f;//获取⼀个字节数据的低4位
HighByte +=0x30;//得到对应的字符,若是字母还需要跳过7个符号
if(HighByte <=0x39)//数字
dest[i*2]= HighByte;
else//字母
dest[i*2]= HighByte +0x07;//得到字符后保存到对应位置
LowByte +=0x30;
if(LowByte <=0x39)
dest[i*2+1]= LowByte;
else
dest[i*2+1]= LowByte +0x07;
}
return;
}
三. 字符流转字节流实现
字符流的数据中,两个字符转为⼀个字节流数据,如字符串"1afd3c",可转为数值0x1a,0xfd,0x3c
* */
void Str2Hex(const char*source,int source_len,char*dest)
{
int        i;
unsigned char    HighByte;//保存⾼位
unsigned char    LowByte;//保存低位
for(i=0; i<source_len; i++)
{
HighByte =toupper(source[i*2]);//如果遇到⼩写,则转为⼤写处理        LowByte =toupper(source[i*2+1]);
if(HighByte <=0x39)//0x39对应字符'9',这⾥表⽰是数字
HighByte -=0x30;
else//否则为字母,需要跳过7个符号
HighByte -=0x37;
if(LowByte <=0x39)
LowByte -=0x30;
else
LowByte -=0x37;
/*
*  假设字符串"3c"
*  则 HighByte = 0x03,⼆进制为 0000 0011
*    LowByte = 0x0c,⼆进制为 0000 1100
*
*      HighByte << 4 = 0011 0000
*      HighByte | LowByte :
*
*      0011 0000
*      0000 1100
*    -------------
*      0011 1100
*
*      即 0x3c
*
**/
dest[i]=(HighByte <<4)| LowByte;
}
}
四. 测试程序
4.1 头⽂件
/******************************************************************************** *      Copyright:  (C) 2020 LuXiaoyang<920916829@qq>
*                  All rights reserved.
*
*      Filename:  String_Bytes.h
*    Description:  This head file
*
*        Version:  1.0.0(30/07/20)
*        Author:  LuXiaoyang <920916829@qq>
*      ChangeLog:  1, Release initial version on "30/07/20 16:58:45" *
********************************************************************************/ #ifndef  _STRING_BYTES_H_
#define  _STRING_BYTES_H_
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define BUFLENGTH 32
/* 字节流转字符流 */
void Hex2Str(const char*source,int source_len,char*dest);
/* 字符流转字节流 */
void Str2Hex(const char*source,int source_len,char*dest);
#endif/* ----- #ifndef _STRING_BYTES_H_  ----- */
4.2 ⽤于测试的程序

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。