| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | using System;using System.IO;using System.Text;namespace Core.Util.Extension{    public static class StreamExtension    {        /// <summary>        /// 压入一个布尔量,当前位置提升1        /// </summary>        /// <param name="stream"></param>        /// <param name="value"></param>        /// <returns></returns>        public static Stream Push(this Stream stream, bool value)        {            //stream.WriteArray()            return stream;        }    }    /// <summary>编码助手</summary>    public static class EncodingHelper    {        #region 编码检测        /// <summary>检测文件编码</summary>        public static Encoding Detect(this string filename)        {            using (var fs = File.OpenRead(filename))            {                return Detect(fs);            }        }        /// <summary>检测文件编码</summary>        public static Encoding DetectEncoding(this FileInfo file)        {            using (var fs = file.OpenRead())            {                return fs.Detect();            }        }        /// <summary>检测数据流编码</summary>        /// <param name="stream">数据流</param>        /// <param name="sampleSize">BOM检测失败时用于启发式探索的数据大小</param>        /// <returns></returns>        public static Encoding Detect(this Stream stream, long sampleSize = 0x400)        {            // 记录数据流原始位置,后面需要复原            var pos = stream.Position;            stream.Position = 0;            // 首先检查BOM            var boms = new byte[stream.Length > 4 ? 4 : stream.Length];            stream.Read(boms, 0, boms.Length);            var encoding = boms.Detect();            if (encoding != null)            {                stream.Position = pos;                return encoding;            }            // BOM检测失败,开始启发式探测            // 抽查一段字节数组            var data = new byte[sampleSize > stream.Length ? stream.Length : sampleSize];            Array.Copy(boms, data, boms.Length);            if (stream.Length > boms.Length) stream.Read(data, boms.Length, data.Length - boms.Length);            stream.Position = pos;            return data.DetectInternal();        }                #endregion    }}
 |