How can I implement IRandomAccessStream in C#?

前端 未结 2 893
失恋的感觉
失恋的感觉 2020-12-19 06:57

I would like to implement an instance of IRandomAccessStream in C# (it will be returning data generated in realtime). The stream does not actually need to be wr

2条回答
  •  孤城傲影
    2020-12-19 07:35

    How to Convert byte Array to IRandomAccessStream

    I've found this blog article, hopefully this realization of IRandomAccessStream can be a starting point for you.

    class MemoryRandomAccessStream : IRandomAccessStream
    {
        private Stream m_InternalStream;
    
        public MemoryRandomAccessStream(Stream stream)
        {
            this.m_InternalStream = stream;
        }
    
        public MemoryRandomAccessStream(byte[] bytes)
        {
            this.m_InternalStream = new MemoryStream(bytes);
        }
    
        public IInputStream GetInputStreamAt(ulong position)
        {
            this.m_InternalStream.Seek((long)position, SeekOrigin.Begin);
    
            return this.m_InternalStream.AsInputStream();
        }
    
        public IOutputStream GetOutputStreamAt(ulong position)
        {
            this.m_InternalStream.Seek((long)position, SeekOrigin.Begin);
    
            return this.m_InternalStream.AsOutputStream();
        }
    
        public ulong Size
        {
            get { return (ulong)this.m_InternalStream.Length; }
            set { this.m_InternalStream.SetLength((long)value); }
        }
    
        public bool CanRead
        {
            get { return true; }
        }
    
        public bool CanWrite
        {
            get { return true; }
        }
    
        public IRandomAccessStream CloneStream()
        {
            throw new NotSupportedException();
        }
    
        public ulong Position
        {
            get { return (ulong)this.m_InternalStream.Position; }
        }
    
        public void Seek(ulong position)
        {
            this.m_InternalStream.Seek((long)position, 0);
        }
    
        public void Dispose()
        {
            this.m_InternalStream.Dispose();
        }
    
        public Windows.Foundation.IAsyncOperationWithProgress ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
        {
            var inputStream = this.GetInputStreamAt(0);
            return inputStream.ReadAsync(buffer, count, options);
        }
    
        public Windows.Foundation.IAsyncOperation FlushAsync()
        {
            var outputStream = this.GetOutputStreamAt(0);
            return outputStream.FlushAsync();
        }
    
        public Windows.Foundation.IAsyncOperationWithProgress WriteAsync(IBuffer buffer)
        {
            var outputStream = this.GetOutputStreamAt(0);
            return outputStream.WriteAsync(buffer);
         }
    }
    

提交回复
热议问题