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 ...
随机推荐
- jquery选择器 看这个链接吧!2017.6.2
http://www.cnblogs.com/tylerdonet/archive/2013/04/02/2996713.html关于jquery选择器说明.
- 35.app后端搜索入门
现在人们的网络生活已经离不开搜索了,遇到不懂的问题,想知道的事情,搜索一下,就知道答案. 在app中,最常见的搜索情景就是搜索用户.只有几百,几千的用户量时,可以直接用用like这样的模糊查询,但是, ...
- phantomjs Can not connect to the Service phantomjs错误
尝试方法一: 打开hosts文件配置 cat /etc/hosts 添加 127.0.0.1 localhost 重新运行 尝试方法二: 1,抛开服务,直接调用phantomjs定位问题 由于我是从服 ...
- python的加、减、乘、除、取整、取余计算
加法: 输入以下代码: >>>1+1 >>>1.0+1 减法: 输入以下代码: >>>1-2 >>>1.0-2 乘法: 输入以下 ...
- 第一天 Java语言概述
一.什么是软件 软件就是按照特定的顺序把数据和指令组合在一起,能够完成相应功能的程序. 软件分为两种: 系统软件:专门用户运行其他程序的平台.比如Linux.Windows.MAC等 应用软件:完成相 ...
- monitor.go
package main import ( "fmt" "net/http" ) // 查询监控信息的接口 func statsHandler( ...
- BZOJ_4590_[Shoi2015]自动刷题机_二分答案
BZOJ_4590_[Shoi2015]自动刷题机_二分答案 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题 ...
- Django中Middleware中间件
Django中Middleware中间件 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法.实际上当 ...
- 机器学习类别不平衡处理之欠采样(undersampling)
类别不平衡就是指分类任务中不同类别的训练样例数目差别很大的情况 常用的做法有三种,分别是1.欠采样, 2.过采样, 3.阈值移动 由于这几天做的project的target为正值的概率不到4%,且数据 ...
- Java I/O流详解与应用(二)
I/O流(二) 一.缓冲流(缓冲区): 特点:本身没有读写的能力,需要借助普通的读写流进行读写,但可以加快读写的效率 分类:字符缓冲流:BufferedReader(读),BufferedWriter ...