[C#基础]字符编码与⼆进制
参考链接:
字符编码的重要性:
世界上存在着多种编码⽅式,同⼀个⼆进制数字可以被解释成不同的符号。
因此,要想打开⼀个⽂本⽂件,就必须知道它的编码⽅式,否则⽤错误的编码⽅式解读,就会出现乱码。
基础知识:
1字节=8位,可以表⽰256个字符,从8个0到8个1
c#数据类型占⽤的字节数:
bool -> System.Boolean (布尔型,其值为 true 或者 false)
byte -> System.Byte (字节型,占 1 字节,表⽰ 8 位正整数,范围 0 ~ 255)
sbyte -> System.SByte (带符号字节型,占 1 字节,表⽰ 8 位整数,范围 -128 ~ 127)
char -> System.Char (字符型,占2字节,表⽰ 1 个 Unicode 字符)
short -> System.Int16 (短整型,占 2 字节,表⽰ 16 位整数,范围 -32,768 ~ 32,767)
ushort -> System.UInt16 (⽆符号短整型,占 2 字节,表⽰ 16 位正整数,范围 0 ~ 65,535)
uint -> System.UInt32 (⽆符号整型,占 4 字节,表⽰ 32 位正整数,范围 0 ~ 4,294,967,295)
int -> System.Int32 (整型,占 4 字节,表⽰ 32 位整数,范围 -2,147,483,648 到 2,147,483,647)
float -> System.Single (单精度浮点型,占 4 个字节)
ulong -> System.UInt64 (⽆符号长整型,占 8 字节,表⽰ 64 位正整数,范围 0 ~ ⼤约 10 的 20 次⽅) long -> System.Int64 (长整型,占 8 字节,表⽰ 64 位整数,范围⼤约 -(10 的 19) 次⽅ 到 10 的 19 次⽅) double -> System.Double (双精度浮点型,占8 个字节)
0.
a.⼆进制,逢⼆进⼀,主要⽤在加减法的运算
例:1011 + 11 = 1110
b.0x开头,表⽰⼗六进制(是数字0,不是字母o)
例:0x100F
1.& 与
类似于"and",两个⼆进制数,均为1时结果为1,否则为0
例:0000 1001 & 0000 0101 = 0000 0001
2.| 或
类似于"or",两个⼆进制数,只要有1结果为1,否则为0
例:0000 1001 | 0000 0101 = 0000 1101
与、或运算通常⽤于将某些位清零,或者保留某些位
例:a & 0000 1111 表⽰将⾼四位清零,保留低四位
3.<< 左移
左移运算是将⼀个⼆进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位⼀律补0
unicode编码转换二进制4.>> 右移
右移运算是将⼀个⼆进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边的空位⼀律补0,
或者补符号位,这由不同的机器⽽定
常见字符编码:
1. ASCII码
ASCII码⼀共规定了128个字符的编码,只占⽤了⼀个字节的后⾯7位,最前⾯的1位统⼀规定为0。
缺点:英语⽤128个符号编码就够了,但是⽤来表⽰其他语⾔,128个符号是不够的。
2.Unicode(相当于UTF-16)
Unicode是⼀个很⼤的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不⼀样,可以解决乱码问题。⼀个Unicode字符由两个字节组成。
缺点:Unicode固然统⼀了编码⽅式,但是它的效率不⾼,⽐如UCS-4(Unicode的标准之⼀)规定⽤4个字节存储⼀个符号,那么每个英⽂字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。
3.UTF-8
为了提⾼Unicode的编码效率,于是就出现了UTF-8编码。UTF-8可以根据不同的符号⾃动选择编码的长短。⽐如英⽂字母可以只⽤1个字节就够了。
UTF-8就是在互联⽹上使⽤最⼴的⼀种Unicode的实现⽅式。其他实现⽅式还包括UTF-16(字符⽤两个字节或四个字节表⽰)和UTF-
32(字符⽤四个字节表⽰),不过在互联⽹上基本不⽤。重复⼀遍,这⾥的关系是,UTF-8是Unicode的实现⽅式之⼀。
4.GBK
GBK采⽤双字节表⽰,解决汉字编码的问题。
c#中⼆进制⽂件的读写:
Array.Copy:从指定的源索引开始,复制 中的⼀系列元素,将它们粘贴到另⼀ 中(从指定的⽬标索引开始)。
public static void Copy(
Array sourceArray,
int sourceIndex,
Array destinationArray,
int destinationIndex,
int length
)
using UnityEngine;
using System.Collections;
using System.IO;
using System.Text;
using UnityEditor;
public class TestByte : MonoBehaviour {
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1)) WriteByte(); if (Input.GetKeyDown(KeyCode.Alpha2)) ReadByte(); }
void WriteByte()
{
string path = Application.dataPath + @"/";
if (File.Exists(path))
File.Delete(path);
FileStream fs = new FileStream(path,FileMode.Create); BinaryWriter bw = new BinaryWriter(fs);
bw.Write("宏哥");
bw.Write((short)1995);
bw.Write((int)2015);
bw.Write((float)530);
bw.Write(true);
bw.Close();
fs.Close();
AssetDatabase.Refresh();
}
void ReadByte()
{
string path = Application.dataPath + @"/";
FileStream fs = new FileStream(path, FileMode.Open); BinaryReader br = new BinaryReader(fs);
print(br.ReadString());
print(br.ReadInt16());
print(br.ReadInt32());
print(br.ReadSingle());
print(br.ReadBoolean());
br.Close();
fs.Close();
}
}
⼆进制⽂件:
输出:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.IO;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
TestMemoryStream();
TestBinaryReaderWriter();
Console.ReadLine();
}
static void TestMemoryStream()
{
//如果使⽤⽂件流,则信息会被写进⽂件中
//⽽使⽤内存流,则信息会被写进内存中,不会产⽣额外的⽂件
MemoryStream ms = new MemoryStream();
//将待写⼊的数据从字符串转换为字节数组
byte[] testBytes = Encoding.UTF8.GetBytes("测试数据");
PrintInfo(ms);
ms.Write(testBytes, 0, testBytes.Length);
PrintInfo(ms);
//SeekOrigin的三种取值:
//1.Begin 指定流的开头 2.Current 指定流内的当前位置 3.End 指定流的结尾
//将position重定位为开头
ms.Seek(0, SeekOrigin.Begin);
byte[] bytes = new byte[testBytes.Length];
ms.Read(bytes, 0, bytes.Length);
Console.WriteLine("bytes:{0}", Encoding.UTF8.GetString(bytes, 0, bytes.Length)); PrintInfo(ms);
byte[] buffer = ms.GetBuffer();
Console.WriteLine("buffer:{0}", Encoding.UTF8.GetString(buffer, 0, buffer.Length)); PrintInfo(ms);
}
static void PrintInfo(MemoryStream ms)
{
Console.WriteLine("Capacity:{0}", ms.Capacity);
Console.WriteLine("Length:{0}", ms.Length);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论