zoukankan      html  css  js  c++  java
  • IRandomAccessStream, IBuffer, Stream, byte[] 之间相互转换

    /*
     * 用于实现 IRandomAccessStream, IBuffer, Stream, byte[] 之间相互转换的帮助类
     */

    using System;
    using System.IO;
    using System.Runtime.InteropServices.WindowsRuntime;
    using System.Threading.Tasks;
    using Windows.Storage.Streams;

    namespace XamlDemo.FileSystem
    {
        /// <summary>
        /// 转来转去的帮助类
        /// </summary>
        public class ConverterHelper
        {
            public async static Task<IRandomAccessStream> Buffer2RandomAccessStream(IBuffer buffer)
            {
                IRandomAccessStream randomStream = new InMemoryRandomAccessStream();
                DataWriter dataWriter = new DataWriter(randomStream);
                dataWriter.WriteBuffer(buffer, 0, buffer.Length);
                await dataWriter.StoreAsync();
                return randomStream;
            }
            public static IBuffer RandomAccessStream2Buffer(IRandomAccessStream randomStream)
            {
                Stream stream = WindowsRuntimeStreamExtensions.AsStreamForRead(randomStream.GetInputStreamAt(0));
                MemoryStream memoryStream = new MemoryStream();
                if (stream != null)
                {
                    byte[] bytes = Stream2Bytes(stream);
                    if (bytes != null)
                    {
                        var binaryWriter = new BinaryWriter(memoryStream);
                        binaryWriter.Write(bytes);
                    }
                }
                IBuffer buffer = WindowsRuntimeBufferExtensions.GetWindowsRuntimeBuffer(memoryStream, 0, (int)memoryStream.Length);
                return buffer;
            }


            public async static Task<IRandomAccessStream> Stream2RandomAccessStream(Stream stream)
            {
                byte[] bytes = Stream2Bytes(stream);
                IRandomAccessStream randomStream = new InMemoryRandomAccessStream();
                DataWriter dataWriter = new DataWriter(randomStream.GetOutputStreamAt(0));
                dataWriter.WriteBytes(bytes);
                await dataWriter.StoreAsync();

                return randomStream;
            }
            public static Stream RandomAccessStream2Stream(IRandomAccessStream randomStream)
            {
                Stream stream = WindowsRuntimeStreamExtensions.AsStreamForRead(randomStream.GetInputStreamAt(0));
                return stream;
            }


            public static Stream Buffer2Stream(IBuffer buffer)
            {
                Stream stream = WindowsRuntimeBufferExtensions.AsStream(buffer);
                return stream;
            }
            public static IBuffer Stream2Buffer(Stream stream)
            {
                MemoryStream memoryStream = new MemoryStream();
                if (stream != null)
                {
                    byte[] bytes = Stream2Bytes(stream);
                    if (bytes != null)
                    {
                        var binaryWriter = new BinaryWriter(memoryStream);
                        binaryWriter.Write(bytes);
                    }
                }
                IBuffer buffer = WindowsRuntimeBufferExtensions.GetWindowsRuntimeBuffer(memoryStream, 0, (int)memoryStream.Length);
                return buffer;
            }


            public static FileInputStream RandomAccessStream2FileInputStream(IRandomAccessStream randomStream)
            {
                FileInputStream inputStream = randomStream.GetInputStreamAt(0) as FileInputStream;
                return inputStream;
            }
            public static FileOutputStream RandomAccessStream2FileOutputStream(IRandomAccessStream randomStream)
            {
                FileOutputStream outputStream = randomStream.GetOutputStreamAt(0) as FileOutputStream;
                return outputStream;
            }


            public static IBuffer String2Buffer(string str)
            {
                using (InMemoryRandomAccessStream memoryStream = new InMemoryRandomAccessStream())
                {
                    using (DataWriter dataWriter = new DataWriter(memoryStream))
                    {
                        dataWriter.WriteString(str);
                        return dataWriter.DetachBuffer();
                    }
                }
            }
            public static string Buffer2String(IBuffer buffer)
            {
                using (DataReader dataReader = DataReader.FromBuffer(buffer))
                {
                    string fileContent = dataReader.ReadString(buffer.Length);
                    return fileContent;
                }
            }


            public static IBuffer Bytes2Buffer(byte[] bytes)
            {
                using (var dataWriter = new DataWriter())
                {
                    dataWriter.WriteBytes(bytes);
                    return dataWriter.DetachBuffer();
                }
            }
            public static byte[] Buffer2Bytes(IBuffer buffer)
            {
                using (var dataReader = DataReader.FromBuffer(buffer))
                {
                    var bytes = new byte[buffer.Length];
                    dataReader.ReadBytes(bytes);
                    return bytes;
                }
            }


            public static byte[] Stream2Bytes(Stream stream)
            {
                if (stream.CanSeek) // stream.Length 已确定
                {
                    byte[] bytes = new byte[stream.Length];
                    stream.Read(bytes, 0, bytes.Length);
                    stream.Seek(0, SeekOrigin.Begin);
                    return bytes;
                }
                else // stream.Length 不确定
                {
                    int initialLength = 32768; // 32k

                    byte[] buffer = new byte[initialLength];
                    int read = 0;

                    int chunk;
                    while ((chunk = stream.Read(buffer, read, buffer.Length - read)) > 0)
                    {
                        read += chunk;

                        if (read == buffer.Length)
                        {
                            int nextByte = stream.ReadByte();

                            if (nextByte == -1)
                            {
                                return buffer;
                            }

                            byte[] newBuffer = new byte[buffer.Length * 2];
                            Array.Copy(buffer, newBuffer, buffer.Length);
                            newBuffer[read] = (byte)nextByte;
                            buffer = newBuffer;
                            read++;
                        }
                    }

                    byte[] ret = new byte[read];
                    Array.Copy(buffer, ret, read);
                    return ret;
                }
            }
            public static Stream Bytes2Stream(byte[] bytes)
            {
                Stream stream = new MemoryStream(bytes);
                return stream;
            }
        }
    }

  • 相关阅读:
    购买成熟软件产品后的二次开发的问题
    outlook2010如何导入csv的通讯录?
    导入Excel数据时对数据校验提示方法
    系统开发中存储过程使用的优势和劣势
    FCKeditor.Net_2.5的使用
    [正则表达式]如何高亮显示搜索关键字
    国外网站模板网址集锦
    _NET 下 FCKeditor_2_5_1上传图片的配置
    用属性模拟多继承机制
    FCKeditor 2.6在ASP.NET中的配置方法
  • 原文地址:https://www.cnblogs.com/ansen312/p/5919807.html
Copyright © 2011-2022 走看看