- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试从 ReadOnlySequence
中读取一些数据。数据被格式化为帧。每个帧都以 NULL 字节(八位字节 0)结束。
我的代码使用 ReadOnlySequence.PositionOf
搜索帧的结尾。当它找到一个 NULL 字节时,它将处理所有字节直到 NULL 字节的位置。处理后,我想通过切片输入来处理下一帧并重复前面的步骤。由于帧在 NULL 字节之前结束,如果我不再次对输入数据进行切片(start = 1),NULL 字节将成为下一个字节序列的一部分。
有没有办法用 SequencePosition
+ 1 个项目/字节作为起始值来切片 ReadOnlySequence
?
我尝试使用 SequencePosition.GetInteger
+ 1 作为起始值,但这不起作用,因为 GetInteger
有时返回的值大于 ReadOnlySequence 的长度
。对 GetInteger
返回的值进行切片会导致以下异常:System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围。 (参数'开始')
最小可重现示例
using System;
using System.Buffers;
using System.IO.Pipelines;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
public class Program
{
private static IDuplexPipe _pipe;
public static async Task Main( String[] args )
{
var pipe = new Pipe();
_pipe = new DuplexPipe( pipe.Reader, pipe.Writer );
var firstMessage = Encoding.UTF8.GetBytes( "CONNECTED\nversion:1.1\nsession:2a840965\nserver:ActiveMQ-Artemis/2.8.0 ActiveMQ Artemis Messaging Engine\nheart-beat:10000,10000\n\n\0\n" );
await _pipe.Output.WriteAsync( firstMessage );
await _pipe.Output.FlushAsync();
var secondMessage =
Encoding.UTF8.GetBytes(
"\n\nMESSAGE\nsubscription:test-839c7766-0f38-4579-a3fc-74de35408536Sub1\ncontent-length:4\nmessage-id:2147486350\ndestination:/queue/TestQ\nexpires:1572278642017\nredelivered:false\npriority:5\npersistent:true\ntimestamp:1572278582050\ndestination-type:ANYCAST\nreceipt:2\ntest:test\nNMSXDeliveryMode:true\ntransformation:jms-byte\ntimestamp:1572278582017\n\nHello World\0\n" );
await _pipe.Output.WriteAsync( secondMessage );
await _pipe.Output.FlushAsync();
var readResult = await _pipe.Input.ReadAsync();
var buffer = readResult.Buffer;
while ( TryParseFrame( ref buffer ) )
{
// ...
}
_pipe.Input.AdvanceTo( buffer.Start, buffer.End );
Console.ReadLine();
}
private static Boolean TryParseFrame( ref ReadOnlySequence<Byte> inputBuffer )
{
var endOfFrame = inputBuffer.PositionOf( ByteConstants.Null );
if ( endOfFrame == null )
return false;
var frameBuffer = inputBuffer.Slice( 0, endOfFrame.Value );
// parse and process the frame...
// This works....
//inputBuffer = inputBuffer.Slice( frameBuffer.End );
//inputBuffer = inputBuffer.Slice( 1 );
// This does NOT.
try
{
var end = frameBuffer.End.GetInteger();
var length = inputBuffer.Length;
Console.WriteLine( $" END: {end}, LENGTH: {length} " );
inputBuffer = inputBuffer.Slice( end + 1 );
}
catch ( Exception ex )
{
Console.WriteLine( ex );
// Make sure we can read the next frame...
inputBuffer = inputBuffer.Slice( frameBuffer.End );
inputBuffer = inputBuffer.Slice( 1 );
}
return true;
}
}
public class DuplexPipe : IDuplexPipe
{
public DuplexPipe( PipeReader input, PipeWriter output )
{
Input = input;
Output = output;
}
public PipeReader Input { get; }
public PipeWriter Output { get; }
}
public static class ByteConstants
{
public const Byte HeaderDelimiter = 58;
public const Byte LineFeed = 10;
public const Byte Null = 0;
}
}
最佳答案
我最近玩了玩管道,很快就放弃了操作 SequencePosition
结构。
ReadOnlySequence
公开了一个 GetPosition(Int64, SequencePosition)
方法,其中第一个参数是从提供的 SequencePosition 开始的偏移量(读取距离)
(在您的情况下,为终止空字节返回的位置)。
考虑以下几点:
private static bool TryParseFrame(ref ReadOnlySequence<byte> inputBuffer)
{
var endOfFrame = inputBuffer.PositionOf(ByteConstants.Null);
if (endOfFrame == null)
return false;
// Get SequencePosition 1 place after endOfFrame
var sliceEnd = inputBuffer.GetPosition(1, endOfFrame.Value);
inputBuffer = inputBuffer.Slice(0, sliceEnd);
return true;
}
不确定以上是否正是您要找的,但希望 GetPosition()
能帮到您。
免责声明:我不知道如果您的偏移量落在 ReadOnlySequence
之外会发生什么,但我想您在尝试对缓冲区进行切片时会遇到问题。但是,在您的特定情况下,您已经知道该字节在那里。
关于c# - ReadOnlySequence – 切片到给定的 SequencePosition + 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58558075/
在下面的代码中,我得到一个 uninitialized value警告,但仅限于第二个 given/when例子。为什么是这样? #!/usr/bin/env perl use warnings; u
整个“开关”功能是否已成为实验性的?在没有 Perl 的 future 版本破坏我的代码的情况下,我可以依赖其中的某些部分吗?一般来说,将稳定功能更改为实验性的政策是什么? 背景use feature
有没有办法在一个条件语句中写出如下语句? a和b不能同时等于5。 (a可以是5,b可以是5,但是a AND b不能是5) 最佳答案 正如克里斯指出的那样,您要查找的是逻辑异或,相当于逻辑不等于 !=:
我正在寻找一种算法来找到给定 n 条线段的所有交点。以下是来自 http://jeffe.cs.illinois.edu/teaching/373/notes/x06-sweepline.pdf 的伪
数组中有 N 个元素。我可以选择第一项最多 N 次,第二项最多选择 N-1 次,依此类推。 我有 K 个 token 要使用并且需要使用它们以便我可以拥有最大数量的项目。 arr = [3, 4, 8
我正在尝试修复法语文本中的语法性别,想知道是否有办法从某个词条中获取所有单词的列表,以及是否可以在此类列表中进行查找? 最佳答案 尝试: import spacy lemma_lookup = spa
我正在为 Win32 编写一个简单的自动化测试应用程序。它作为一个单独的进程运行,并通过 Windows API 访问目标应用程序。我可以阅读窗口层次结构,查找标签和文本框,并通过发送/发布消息等来单
在 nodeJs 中使用 Sequelize 时,我从 Sequelize 收到此错误,如下所示: { [SequelizeUniqueConstraintError: Validation erro
本文https://arxiv.org/pdf/1703.10757.pdf使用回归激活映射 (RAM) - 而不是类激活映射 (CAM) 来解决问题。有几篇文章描述了如何实现 CAM。但是我找不到
我正在研究 Mach 动态链接器 dyld。这个问题适用于所有 Apple 平台,但很高兴得到特定于平台的答案;我正在使用 ObjC,但如果对你有用的话,我也很乐意翻译 Swift。 The rele
我有一个包含数千个 Instagram 用户 ID 的列表。我如何获得他们的 Instagram 用户名/句柄? 最佳答案 你必须使用这个 Instagram API: https://api.ins
我在下面的代码: def main(args: Array[String]) { val sparkConf = new SparkConf().setAppName("Spark-Hbase").s
我有一个表格,其中包含从 1 到 10 的数字。(从 D2 到 M2) 假设A1中有03/09/2019 并且在B1中有06/09/2019 并且在C1中有Hello 在A 列中,我有多个系列的单词,
我想在给定服务对应的 URI 的情况下检索服务的注释(特别是 @RolesAllowed )。这是一个例子: 服务: @GET @Path("/example") @RolesAllowed({ "B
我看到 OraclePreparedStatementexecuteQuery() 表现出序列化。也就是说,我想使用相同的连接对 Oracle 数据库同时运行两个查询。然而,OraclePrepare
import java.util.Scanner; public class GeometricSumFromK { public static int geometricSum(int k,
我创建了一个抽象基类Page,它说明了如何构建动态网页。我正在尝试想出一种基于作为 HttpServletRequest 传入的 GET 请求生成 Page 的好方法。例如... public cla
我的字符串是一条短信,采用以下两种格式之一: 潜在客户短信: 您已收到 1 条线索 标题:我的领导 潜在客户 ID:12345-2365 警报设置 ID:890 短信回复: 您已收到 1 条回复 标题
我在 python 中有以下代码: class CreateMap: def changeme(listOne, lisrTwo, listThree, listFour, listfive):
这是在 Hibernate 上运行的 JPA2。 我想检索相同实体类型的多个实例,给定它们的 ID。其中许多已经在持久性上下文和/或二级缓存中。 我尝试了几种方法,但似乎都有其缺点: 当我使用 ent
我是一名优秀的程序员,十分优秀!