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;
}
}
}
IRandomAccessStream, IBuffer, Stream, byte[] 之间相互转换的更多相关文章
- C# 字符串string和内存流MemoryStream及比特数组byte[]之间相互转换
定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串转比特数组 复制代码 代码如下: (1)byte[] bt=System.Text.Encoding.Default.GetB ...
- java中String\十六进制String\byte[]之间相互转换函数
java二进制,字节数组,字符,十六进制,BCD编码转换2007-06-07 00:17/** *//** * 把16进制字符串转换成字节数组 * @param hex * @return */ pu ...
- byte[] Base64 Stream 之间相互转换
图片 base64转byte[] /// <summary> /// 保存base64图片,返回阿里云地址 /// </summary> /// <param name= ...
- C# Stream 和 byte[] 之间的转换
一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream( ...
- Stream 和 byte[] 之间的转换
Stream 和 byte[] 之间的转换 一. 二进制转换成图片 ? 1 2 3 4 5 MemoryStream ms = new MemoryStream(bytes); ms.Position ...
- C# Stream 和 byte[] 之间的转换(文件流的应用)
一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream( ...
- C#图像处理:Stream 与 byte[] 相互转换,byte[]与string,Stream 与 File 相互转换等
C# Stream 和 byte[] 之间的转换 一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = 0; Ima ...
- C#实现Stream与byte[]之间的转换实例教程
一.二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream(m ...
- 将String转化成Stream,将Stream转换成String, C# Stream 和 byte[] 之间的转换(文件流的应用)
static void Main( string[] args ) { string str = "Testing 1-2-3"; //convert string 2 strea ...
随机推荐
- flask+sqlite3+echarts2+ajax数据可视化报错:UnicodeDecodeError: 'utf8' codec can't decode byte解决方法
flask+sqlite3+echarts2+ajax数据可视化报错: UnicodeDecodeError: 'utf8' codec can't decode byte 解决方法: 将 py文件和 ...
- 【挖财工作笔记】idea使用指南
一 安装破解 破解选择服务器,然后选择地址:http://www.iteblog.com/idea/key.php http://idea.iteblog.com/key.php http://i ...
- Python 生成器与迭代器 yield 案例分析
前几天刚开始看 Python ,后因为项目突然到来,导致Python的学习搁置了几天.然后今天看回Python 发现 Yield 这个忽然想不起是干嘛用的了(所以,好记性不如烂笔头.).然后只能 花点 ...
- 面向对象设计模式纵横谈:Singelton单件模式(笔记记录)
李建忠老师讲的<面向对象设计模式纵横谈>,早就看过了,现在有了时间重新整理一下,以前的博客[赛迪网]没有了,现在搬到博客园,重新过一遍,也便于以后浏览. 设计模式从不同的角度分类会得 ...
- CodeSmith7 系列 破解教程
CodeSmith[点此下载] 学过三层的人应该认识CodeSmith Generator吧,今天我就跟大家一起探讨下CodeSmith Generator 7.0.2的激活,这最新版本破解的难度也是 ...
- CSS3写折纸
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- CentOS7中安装Python3.5
1.下载 https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz 2.上传到服务器 3. 安装相关依赖 yum install gcc ope ...
- Sharepoint2013 AD组用户不同步
背景: SP2013列表库使用AD安全组授权访问,向AD安全组添加一个用户A,在Sharepoint AD同步(增量和完全)后,用户A仍然无法访问列表库:原因: 参考:安全令牌上的缓存 SP2013 ...
- iOS之数据解析时<null>的处理
在iOS开发过程中经常需要与服务器进行数据通讯,JSON就是一种常用的高效简洁的数据格式. 问题: 在项目中,一直遇到一个坑的问题,程序在获取某些数据之后莫名崩溃.原因是:由于服务器的数据库中有些字段 ...
- 关于bundle install 的一点补充
在第一次运行bundle install之后,生成了Gemfile.lock文件,里面记录gem的具体版本号,按照官方文档说明,以后运行bundle install就不会再依据Gemfile,而是根据 ...