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[]的相关操作的更多相关文章

  1. (转)Go中的string和[]byte对比

    本文转自:https://sheepbao.github.io/post/golang_byte_slice_and_string/ 作者:boya 声明:本文目的仅仅作为个人mark,所以在翻译的过 ...

  2. C#中有关string和byte[]转换的问题

    byte[] byteArray = System.Text.Encoding.Default.GetBytes( str ); 怎么样,够简单吧? 反过来也是一样,把byte[]转成string: ...

  3. WebView中的视频全屏的相关操作

    近期工作中,基本一直在用WebView,今天就把它整理下: WebView 顾名思义,就是放一个网页,一个看起来十分简单,可是用起来不是那么简单的控件. 首先你肯定要定义,初始化一个webview,事 ...

  4. golang中文件以及文件夹路径相关操作

    获取目录中所有文件使用包: io/ioutil 使用方法: ioutil.ReadDir 读取目录 dirmane 中的所有目录和文件(不包括子目录) 返回读取到的文件的信息列表和读取过程中遇到的任何 ...

  5. C#中执行批处理文件(.bat),执行数据库相关操作

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  6. java 中的try catch在文件相关操作的使用

    import java.io.CharConversionException; import java.io.FileNotFoundException; import java.io.FileRea ...

  7. 浅谈python中文件和文件夹的相关操作

    文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...

  8. 在Javascript中使用String.startsWith和endsWith

    在Javascript中使用String.startsWith和endsWith 在操作字符串(String)类型的时候,startsWith(anotherString)和endsWith(anot ...

  9. redis对sorted_set进行的相关操作

    redis对sorted_set(有序集合)类型操作的相关命令以及如何在python使用这些命令 redis对sorted_set(有序集合)类型操作的命令: 命令 语法 概述 返回值 Redis Z ...

随机推荐

  1. Java生成名片式的二维码源码分享

    世界上25%的人都有拖延症——但我觉得这统计肯定少了,至少我就是一名拖延症患者.一直想把“Java生成名片式(带有背景图片.用户网络头像.用户昵称)的二维码”这篇博客分享出来,但一直拖啊拖,拖到现在, ...

  2. Loadrunner 11 中Run-Time Setting详细参数说明

    .General/Run Logic :用来设置运行脚本迭代的次数,迭代次数只对run部分的脚本迭代次数有影响,对init和End部分无印象.一般设置未1~3次,只会影响在单位时间内客户端想服务器提交 ...

  3. APNs 推送原理及问题

    http://bbs.csdn.net/topics/390461996 在 iOS 平台上,大部分应用是不允许在后台运行并连接网络的.在应用没有被运行的时候,只能通过 Apple Push Noti ...

  4. 25个让Java程序员更高效的Eclipse插件

    Eclipse提供了一个可扩展插件的开发系统.这就使得Eclipse在运行系统之上可以实现各种功能.这些插件也不同于其他的应用(插件的功能是最难用代码实现的).拥有合适的Eclipse插件是非常重要的 ...

  5. itchat库初探--微信好友全头像的拼接

        代码: import itchat import math import PIL.Image as Image import os itchat.auto_login() friends = ...

  6. Python操作HBase之happybase

    安装Thrift 安装Thrift的具体操作,请点击链接 pip install thrift 安装happybase pip install happybase 连接(happybase.Conne ...

  7. Semaphore简介

    Semaphore简介 Semaphore是并发包中提供的用于控制某资源同时被访问的个数 操作系统的信号量是个很重要的概念,在进程控制方面都有应用.Java 并发库 的Semaphore 可以很轻松完 ...

  8. BZOJ_2734_[HNOI2012]集合选数_构造+状压DP

    BZOJ_2734_[HNOI2012]集合选数_构造+状压DP 题意:<集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x ...

  9. Opencv(C++)实现邻近插值算法

    #include <opencv2/opencv.hpp> using namespace std; using namespace cv; void Zero_order(const M ...

  10. 学习React Native必看的几个开源项目

    学习React native ,分享几个不错的开源项目,相信你学完之后,一定会有所收获.如果还没有了解RN的同学们可以参考手把手教你React Native 实战之开山篇<一> 1.Fac ...