【问题标题】:C# Convert ReadOnlyMemory<byte> to byte[]C# 将 ReadOnlyMemory<byte> 转换为 byte[]
【发布时间】:2020-04-22 20:45:14
【问题描述】:

给定ReadOnlyMemory Struct 我想将流转换为字符串

我有以下代码:

var body = ea.Body; //ea.Body is of Type ReadOnlyMemory<byte>
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);

它给出了以下错误。我正在使用最新的 C# 和 .NET CORE 3.1

这很有趣,因为我实际上是在复制粘贴 Hello World 示例 of a major product called RabbitMQ,但它无法编译。

【问题讨论】:

标签: c# rabbitmq


【解决方案1】:

您不能将只读内容放入键入为byte[] 的插槽中,因为byte[]s 是可写的,这会破坏目的。貌似是 RabbitMQ changed their API in February 可能忘记更新示例代码了。

一个快速的解决方法是使用.ToArray():

var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);

编辑:既然这被接受了,我会用 Dmitry 和 zenseb 提出的更好的解决方案来修改它,即使用.Span

var body = ea.Body.Span;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);

【讨论】:

  • 请注意,GetString 的重载不包含在 .Net Framework 中。
【解决方案2】:

使用Span property 将消息转换为字符串,无需额外分配内存

var body = ea.Body; //ea.Body is of Type ReadOnlyMemory<byte>
var message = Encoding.UTF8.GetString(body.Span);
Console.WriteLine(" [x] Received {0}", message);

【讨论】:

  • 使用 Span 是否会产生内存限制,例如只取 150 条消息中的前 100 个字符?
  • 可以使用 Span 的 Slice 方法访问已分配内存区域的任意切片,默认 Span 返回所有已分配区域
【解决方案3】:

您需要使用Spanproperty。

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.GetStringReadOnlySpan&lt;byte&gt; 有过载。你可以阅读更多here

【讨论】:

    【解决方案4】:

    我更新了 RabbitMQ.Client 包并在我的 Consumer_Received 方法中遇到了同样的问题:

    private static void Consumer_Received(object sender, BasicDeliverEventArgs e)
            // Code
    

    我检查了BasicDeliverEventArgs,发现Body 现在是ReadOnlyMemory 类型:
    public ReadOnlyMemory&lt;byte&gt; Body { get; set; }

    正如 Jeff 所说,RabbitMQ changed their API,所以我认为这与我们之前在互联网上的教程有所不同。

    要解决这个问题,我只需将我的 Body 消息转换为一个数组(转换为 Consumer_Received 方法):
    var message = Encoding.UTF8.GetString(e.Body.ToArray());

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-03
      • 2011-06-08
      • 1970-01-01
      • 2014-07-21
      • 2018-03-25
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      相关资源
      最近更新 更多