c# UWP - Convert byte array to InMemoryRandomAccessStream/IRandomAccessStream

20,382

Solution 1

Add the using statement at the top of the document.

using System.Runtime.InteropServices.WindowsRuntime;
internal static async Task<InMemoryRandomAccessStream> ConvertTo(byte[] arr)
{
    InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream();
    await randomAccessStream.WriteAsync(arr.AsBuffer());
    randomAccessStream.Seek(0); // Just to be sure.
                    // I don't think you need to flush here, but if it doesn't work, give it a try.
    return randomAccessStream;
}

Solution 2

On Windows 8.1 it's even easier as we added the AsRandomAccessStream extension method:

internal static IRandomAccessStream ConvertTo(byte[] arr)
{
    MemoryStream stream = new MemoryStream(arr);
    return stream.AsRandomAccessStream();
}

Solution 3

In one line:

internal static IRandomAccessStream ConvertTo(byte[] arr)
{
    return arr.AsBuffer().AsStream().AsRandomAccessStream();
}
Share:
20,382

Related videos on Youtube

Alen Lee
Author by

Alen Lee

Updated on March 17, 2022

Comments

  • Alen Lee
    Alen Lee about 2 years

    I have a problem converting byte array to InMemoryRandomAccessStream or IRandomAccessStream in windows 8?

    This is my code, but It doesn't work :

    internal static async Task<InMemoryRandomAccessStream> ConvertTo(byte[] arr) 
    {
        InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream();
        
        Stream stream = randomAccessStream.AsStream();
        
        await stream.WriteAsync(arr, 0, arr.Length);
        await stream.FlushAsync();
    
        return randomAccessStream;
    }
    

    And I created the RandomAccessStreamReference and set the requst datapack in order to share the image to other app

    private static async void OnDeferredImageStreamRequestedHandler(DataProviderRequest Request) 
    {
        DataProviderDeferral deferral = Request.GetDeferral();
        InMemoryRandomAccessStream stream = await ConvertTo(arr);
        
        RandomAccessStreamReference referenceStream =
                RandomAccessStreamReference.CreateFromStream(stream);
        
        Request.SetData(referenceStream);
    }
    

    There's no exception but I can't use the result image byte array

    I think there's an error when converting byte[] to InMemoryRandomAccessStream, but it doesn't throw an exception.

    Anybody know how to implement it?

    if anyone knows how to convert the byte array to IRandomAccessStream, it's also appreciated

    • Security Hound
      Security Hound about 11 years
      What exactly is wrong with the code you have?
    • Farhan Ghumra
      Farhan Ghumra about 11 years
      Please check this & tell me if you can solve the issue.
  • tibel
    tibel over 8 years
    This seems not to work for some scenarios, as described in stackoverflow.com/questions/22332217/…
  • Konstantin S.
    Konstantin S. over 2 years
    It looks like an action that copies the data three times. You need to check that this is not happening in order for the answer to be usable.