Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Convert ReadOnlyMemory<byte> to byte[]

Tags:

c#

rabbitmq

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

enter image description here

Which is funny because I am literally copy pasting the Hello World example of a major product called RabbitMQ and it doesn't compile.

like image 591
Jebathon Avatar asked Apr 22 '20 20:04

Jebathon


Video Answer


2 Answers

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); 
like image 77
Jeff Avatar answered Sep 17 '22 20:09

Jeff


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); 
like image 39
Dmitry Kolchev Avatar answered Sep 21 '22 20:09

Dmitry Kolchev