Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “C”;标签";4字节十六进制块,用于以后重建为原始字符串_C#_Data Structures_Hex_Chunked Encoding - Fatal编程技术网

C# “C”;标签";4字节十六进制块,用于以后重建为原始字符串

C# “C”;标签";4字节十六进制块,用于以后重建为原始字符串,c#,data-structures,hex,chunked-encoding,C#,Data Structures,Hex,Chunked Encoding,我正在与一个特定的问题搏斗,我想就如何实现我所追求的目标寻求指导。给定下面的函数,一个可变长度的字符串被用作输入,它产生一个4字节的十六进制块等价物。这些4字节的数据块被写入XML文件中存储。并且该XML文件的模式不能更改。但是,我的问题是,当管理XML文件的应用程序对XML文件中的4字节块进行排序时。结果,当我读取同一个XML文件时,我的字符串被销毁。所以,我想要一种方法,用某种标识符“标记”每个4字节块,我可以在我的解码器函数中对其进行排序,尽管可能已经对其进行了排序 编码功能(其中大部分由

我正在与一个特定的问题搏斗,我想就如何实现我所追求的目标寻求指导。给定下面的函数,一个可变长度的字符串被用作输入,它产生一个4字节的十六进制块等价物。这些4字节的数据块被写入XML文件中存储。并且该XML文件的模式不能更改。但是,我的问题是,当管理XML文件的应用程序对XML文件中的4字节块进行排序时。结果,当我读取同一个XML文件时,我的字符串被销毁。所以,我想要一种方法,用某种标识符“标记”每个4字节块,我可以在我的解码器函数中对其进行排序,尽管可能已经对其进行了排序

编码功能(其中大部分由(Antonín Lejsek)提供)

专用静态字符串StringEncoder(字符串strInput)
{
尝试
{
//实例化StringBuilder对象,并将sb对象的容量设置为消息的长度。
StringBuilder sb=新StringBuilder(strInput.Length*9/4+10);
整数计数=0;
//迭代消息中的每个字符,并格式化sb对象,以遵循Microsofts对ST_LongHexValue类型的rsidR值的ECMA-376实现
foreach(字符c在strInput中)
{
//用2位零填充前4字节块。
如果(计数=0)
{
某人附加(“00”);
计数=0;
}
//每三个字节添加一个空格并附加两位零。
如果(计数=3)
{
某人加上(“”);
某人附加(“00”);
计数=0;
}
sb.Append(String.Format(“{0:X2}”,(int)c));
计数++;
}
//处理大于1字节但小于3字节的编码字节,这样我们就知道要用多少字节来填充。
对于(整数i=0;i<(3-计数)%3;++i)
{
某人附加(“00”);
}
//调试:回显测试结果。
//控制台。写线(“”);
//WriteLine(“提供的字符串:{0}”,strInput);
//WriteLine(“8位块中的十六进制:{0}”,sb.ToString());
//Console.WriteLine(“============================================================================”);
使某人返回字符串();
}
捕获(NullReferenceException e)
{
控制台。写线(“”);
WriteLine(“错误:StringEncoder接收到空输入。”);
WriteLine(“错误:请确保output.txt文件中有要读取的内容。”);
控制台。写线(“”);
//控制台写入线(e.Message);
返回null;
}
}
例如:当提供以下输入“coolsss”时,此函数将产生以下输出:0020636F 006F6C73 00737300

上面(3)个8位数的块将被写入XML文件,从第一个块开始,一直写到最后一个块

0020636F 006F6C73 00737300

现在,XML文件中还有其他8位数据块不是由上面的函数创建的。这就产生了一个问题,因为应用程序可以在这些数据块之间以及文件中已经存在的其他数据块之间重新排序

00737300 00111111 006F6C73 00000000 0020636F

那么,你能帮我想一想,无论如何,添加某种类型的标记,或者使用某种C#数据结构,以便在重新排序的情况下读取每个块并重建我的原始字符串吗

我感谢您提供的任何指导。感谢Antonín Lejsek对上述功能的帮助

谢谢,,
Gabriel Alicea

嗯,我不愿意将此作为建议的解决方案,因为它对我来说有点太老土了

话虽如此,我想您可以利用第二个字节作为序数,以便跟踪块并在以后“重新组装”字符串

您可以使用以下方案来跟踪块

00XY0000
其中,第二个字节XY可分为两个4位部分,分别表示序数和校验和

X = Ordinal
Y = 16 % X
读取数据块时,您可以像上面一样将第二个字节分成两个字,并验证校验和是否与序号对齐


此解决方案确实会对字符串长度引入16个字符的约束,除非您消除校验和并将整个字节用作序号,您可以将字符串长度增加到256个字符。

catch(NullReferenceException e)
这是一个非常糟糕的方法,因为你正在以这种方式吞下所有NRE bug,并假装它们是预期的情况。谢谢你的提示。我会相应地调整。你知道每个块的最大值吗?如果知道,你知道你可能需要跟踪多少块吗?如果知道,你可能能够预先准备一个标记和序号我将访问块并提取此信息以供稍后重建。@Randy,谢谢你的时间。我将尝试回答你的问题,说每个块都是由应用程序随机生成的,但我插入XML文件的内容除外,它实际上是一个可变长度的字符串。因此,尽管如此,我不确定我是否可以升级t每个块都有一个最大值。类似地,由于字符串的长度可能不同,我插入的块的数量也会不同…每个块的唯一常量是第一个字节必须是“00”.你能提供一个标签和序数的例子吗?我想你可以用区块的前2个十六进制数字来表示标签和原始。每个区块都必须以00开头吗?
X = Ordinal
Y = 16 % X