dotnet中Stream、string及byte[]的相关操作
string与byte[](UTF-8)
//string to byte[]
string str = "abc中文";
//0x61 0x62 0x63 0xE4 0xB8 0xAD 0xE6 0x96 0x87
byte[] bytes = Encoding.UTF8.GetBytes(str); //byte[] to string
//abc中文
str = Encoding.UTF8.GetString(bytes);
string与byte[](ASCII)
//string to byte[]
string str = "abc中文";
//注意:由于ASCII不支持中文,中文转码失败会变成问号(0x3F)
//0x61 0x62 0x63 0x3F 0x3F
byte[] bytes = Encoding.ASCII.GetBytes(str); //byte[] to string
//abc??
str = Encoding.ASCII.GetString(bytes);
Console.WriteLine(str);
string与byte[](GBK)
GBK是GB2312的扩展,其实现在所使用的GB码都是GBK编码,GB2312早就是过去时,但GB2312这个名字由于用了太久,惯性太大,所以一直保留着,并在在当今GB2312与GBK这两个名称被看作是等价的。在dotnet core中,GBK编码默认不被支持,必须引入nuget包:System.Text.Encoding.CodePages,且在程序入口处注册:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
//string to byte[]
string str = "abc中文";
//0x61 0x62 0x63 0xD6 0xD0 0xCE 0xC4
byte[] bytes = Encoding.GetEncoding("GBK").GetBytes(str); //byte[] to string
//abc中文
str = Encoding.GetEncoding("GBK").GetString(bytes);
byte[]与MemoryStream
Stream其实就是对byte[]的一种抽象与封装,计算机世界里的一切代码数据,其实都可以看做Stream,里面包含的是一个个有次序的字节。当然了,跟byte[]相比,Stream通常不能随机访问。MemoryStream表示内存中的Stream,数据存在于内存中,所以它是一个能随机访问的Stream。byte[]与MemoryStream之间能非常方便地转换。
//byte[] to MemoryStream
byte[] bytes = {0x61, 0x62, 0x63, 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87};
MemoryStream ms = new MemoryStream(bytes); //MemoryStream to byte[]
bytes = ms.ToArray();
string与MemoryStream
string与byte[]互转,byte[]与MemoryStream互转,所以这个就不是问题了。
byte[]与Stream
不是所有Stream都像MemoryStream一样能直接和byte[]互转,比如说FileStream,那怎么办呢?不能直接转,那就使用“读写”这两个动作啊,写到Stream去,以及从Stream中读取。
//byte[] to Stream
byte[] bytes = {0x61, 0x62, 0x63, 0xE4, 0xB8, 0xAD, 0xE6, 0x96, 0x87};
using (FileStream fs = File.Create("d:\\test.txt")) {
fs.Write(bytes);
} //Stream to byte[]
using (FileStream fs = File.OpenRead("d:\\test.txt")) {
bytes = new byte[fs.Length];
fs.Read(bytes);
Console.WriteLine(BytesToHexString(bytes));
}
string与文件
由于我们经常要读取文本文件,或把文本写到文件中去,所以dotnet提供了两个简便方法,让我们可以不管FileStream。
string str = "ABC中文"; //string to file
File.WriteAllText("d:\\test.txt", str); //file to string
str = File.ReadAllText("d:\\test.txt");
注意,这两个方法都是认为文件使用了UTF-8编码。另外我是推荐使用这两个方法快速访问文本文件的,因为不同编码格式的文本文件其实还有个字节序标记(BOM,Byte Order Mark)的概念,不过这里就不展开了。
string与Stream
如果Stream来自于网络,没有File.ReadAllText这种方法,那应该怎么做?你当然可以用Stream的Read/Write方法,但读出来byte[]之后还需要再转为string,有点周折。所以dotnet引入了两个对象,StreamReader和StreamWriter,用它们可以实现string到Stream之间的转换。(为简单起见,下面的例子依然使用FileStream)
//Write string to Stream
using (FileStream fs = File.Create("d:\\test.txt")) {
StreamWriter writer = new StreamWriter(fs);
writer.Write("ABC中文");
writer.Flush();
} //Read string from Stream
using (FileStream fs = File.OpenRead("d:\\test.txt")) {
StreamReader reader = new StreamReader(fs)
string str = reader.ReadToEnd();//也可以用ReadLine逐行读取
}
注意1:writer自带缓存调用Flush方法确保数据已经写入流中,另一种方法是将writer包到using代码块中,例子见下
注意2:StreamWriter和StreamReader默认使用UTF-8编码,如果要换一种编码方式,需要手动指定,例子见下
//Write string to Stream
using (FileStream fs = File.Create("d:\\test.txt")) {
using (StreamWriter writer = new StreamWriter(fs, Encoding.GetEncoding("GBK"))) {
writer.Write("ABC中文");
}
}
//Read string from Stream
using (FileStream fs = File.OpenRead("d:\\test.txt")) {
StreamReader reader = new StreamReader(fs, Encoding.GetEncoding("GBK"));
string str = reader.ReadToEnd();//也可以用ReadLine逐行读取
}
注意:要使用GBK编码,请参考“string与byte[](GBK)”中的描述。
dotnet中Stream、string及byte[]的相关操作的更多相关文章
- (转)Go中的string和[]byte对比
本文转自:https://sheepbao.github.io/post/golang_byte_slice_and_string/ 作者:boya 声明:本文目的仅仅作为个人mark,所以在翻译的过 ...
- C#中有关string和byte[]转换的问题
byte[] byteArray = System.Text.Encoding.Default.GetBytes( str ); 怎么样,够简单吧? 反过来也是一样,把byte[]转成string: ...
- WebView中的视频全屏的相关操作
近期工作中,基本一直在用WebView,今天就把它整理下: WebView 顾名思义,就是放一个网页,一个看起来十分简单,可是用起来不是那么简单的控件. 首先你肯定要定义,初始化一个webview,事 ...
- golang中文件以及文件夹路径相关操作
获取目录中所有文件使用包: io/ioutil 使用方法: ioutil.ReadDir 读取目录 dirmane 中的所有目录和文件(不包括子目录) 返回读取到的文件的信息列表和读取过程中遇到的任何 ...
- C#中执行批处理文件(.bat),执行数据库相关操作
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- java 中的try catch在文件相关操作的使用
import java.io.CharConversionException; import java.io.FileNotFoundException; import java.io.FileRea ...
- 浅谈python中文件和文件夹的相关操作
文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...
- 在Javascript中使用String.startsWith和endsWith
在Javascript中使用String.startsWith和endsWith 在操作字符串(String)类型的时候,startsWith(anotherString)和endsWith(anot ...
- redis对sorted_set进行的相关操作
redis对sorted_set(有序集合)类型操作的相关命令以及如何在python使用这些命令 redis对sorted_set(有序集合)类型操作的命令: 命令 语法 概述 返回值 Redis Z ...
随机推荐
- Activity的生命之路
activity的生命周期这张图是最经典的了,下面我就说一下 这张图的脉络: 第一条线我们这么走 onCreate→onStart→onResume→onPause→onStop→onDestroy ...
- Java 面试知识点解析(五)——网络协议篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- 聊一聊顺序消息(RocketMQ顺序消息的实现机制)
当我们说顺序时,我们在说什么? 日常思维中,顺序大部分情况会和时间关联起来,即时间的先后表示事件的顺序关系. 比如事件A发生在下午3点一刻,而事件B发生在下午4点,那么我们认为事件A发生在事件B之前, ...
- python实现简体中文和繁体相互转换
1. opencc-python 如果目录上的链接被屏蔽了,请手动复制 https://pypi.python.org/pypi/opencc-python/ 首先介绍opencc的python实现库 ...
- mysql(mariadb)如何更改root密码
mysql(或者mariadb,她是mysql的一个分支,完全开源,新版本的linux系统默认安装的是mariadb)如何更改root密码呢?我们主要介绍命令mysqladmin来实现. mysql( ...
- 腾讯2017年暑期实习生编程题【算法基础-字符移位】(C++,Python)
算法基础-字符移位 时间限制:1秒 空间限制:32768K 题目: 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间. 你能帮帮小Q吗? ...
- 优化TestNG测试报告
以下内容引自: https://www.cnblogs.com/jwentest/p/7073223.html 优化testng报告 背景 搞过testng的同学都知道,testng自带的报告非常 ...
- 排序系列 之 快速排序算法 —— Java实现
基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变 ...
- BZOJ_5180_[Baltic2016]Cities_ 斯坦纳树
BZOJ_5180_[Baltic2016]Cities_ 斯坦纳树 题意: 给定n个点,m条双向边的图.其中有k个点是重要的.每条边都有一定的长度. 现在要你选定一些边来构成一个图,要使得k个重要的 ...
- BZOJ_2724_[Violet 6]蒲公英_分块
BZOJ_2724_[Violet 6]蒲公英_分块 Description Input 修正一下 l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod ...