C# Convert ReadOnlyMemory<byte> to byte[]
Given ReadOnlyMemory Struct I want to convert the stream into a string
I have the following code:
var body = ea.Body; //ea.Body is of Type ReadOnlyMemory<byte>
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
And it gives the following error. I am using the latest C# with .NET CORE 3.1
Which is funny because I am literally copy pasting the Hello World example of a major product called RabbitMQ and it doesn't compile.
Solution 1:
You cannot drop a thing that's read-only into a slot typed as byte[]
, because byte[]
s are writable and that would defeat the purpose. It looks like RabbitMQ changed their API in February and perhaps forgot to update the sample code.
A quick workaround is to use .ToArray()
:
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
Edit: Since this was accepted, I'll amend it with the better solution posed by Dmitry and zenseb which is to use .Span
:
var body = ea.Body.Span;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
Solution 2:
Use Span property to convert message to string without additional memory allocation
var body = ea.Body; //ea.Body is of Type ReadOnlyMemory<byte>
var message = Encoding.UTF8.GetString(body.Span);
Console.WriteLine(" [x] Received {0}", message);
Solution 3:
You need to use the Span
property.
var data = new byte[] { 72, 101, 108, 108, 111 };
var body = new ReadOnlyMemory<byte>(data);
var text = Encoding.UTF8.GetString(body.Span);
Console.WriteLine(text);
Encoding.UTF8.GetString
has an overload for ReadOnlySpan<byte>
. You can read more here