奇怪的行为C#

时间:2018-01-17 16:58:48

标签: c#

不知何故,我从GetString()获得了一个奇怪的结果。所以,在我的项目中,我得到了这段代码:

byte[] arrayBytes = System.Convert.FromBase64String(n["spo_fdat"].InnerText);
string str = System.Text.Encoding.UTF8.GetString(arrayBytes);

InnerText值和代码位于:https://dotnetfiddle.net/mMUlti

所以,我的问题是,不知怎的,我在Visual Studio上得到了这个结果:

enter image description here

在我上面发布的在线编译器中,输出是预期的。 此输出是打印机的输出,此\ 0正在销毁格式。

任何人都知道发生了什么,我应该做什么/尝试?

2 个答案:

答案 0 :(得分:1)

由于某种原因,输入中的每个其他字节都为空。如果你将它们剥离出来,你会得到一些看似更合理的打印机命令(虽然我不是专家)。希望你能验证一下......

要做到这一点,我所做的就是添加以下内容:

arrayBytes = arrayBytes.Where((x,i)=>i%2==0).ToArray();

where命令取值(x)和索引(i),如果索引模式2为0(即偶数),那么where子句允许它 - 如果奇怪的话它会抛弃它。

我从中得到的输出开始了:

CT~~CD,~CC^~CT~
^XA~TA000~JSN^LT0^MNW^MTT^PON^PMN^LH0,0^JMA^PR2,2~SD15^JUS^LRN^CI0^XZ
^XA
^MMT
^PW607
^LL0406

在那里也有一些非打印字符看起来像可能的打印命令(例如16是第一个字符是“数据链接转义”字符。

事先编辑:

您遇到的问题显然是规范的问题。似乎你的输入是错误的。您需要与生成它的人交谈,找出他们用来生成它的规范,确保他们的ode符合该规范,然后使您的代码接受该规范。有了可靠的规范,您应该编写兼容的代码。

答案 1 :(得分:0)

尝试检查字节。您将看到,与dotnetfiddle的输出相比,您在base-64字符串中编码的内容更接近Visual Studio向您显示的内容。控制台通常不会转义非printables(例如\0 - null字符),而Visual Studio字符串检查器会尝试为其用户提供尽可能多的价值。

查看base-64编码数据,它看起来更像UTF-16而不是UTF-8。如果你这样解码它,你也可能会删除Visual Studio检查器中的null字符。

无论如何,base-64数据没有多大意义。需要更多语义上下文来确定问题所在。

根据Chris的检查,看起来数据是UTF-8编码的UTF-16。

您应该能够通过以下方式获得正确的结果:

var xml = //your base-64 input...
var arrayBytes = Convert.FromBase64String(xml);
var utf16 = Encoding.Unicode.GetString(arrayBytes);
var utf8Bytes = utf16.Select(c => (byte)c).ToArray();
var utf8 = Encoding.UTF8.GetString(utf8Bytes);

Console.WriteLine(utf8);

相反的可能是你的输入是如何创建的。然而,你也可以选择克里斯的忽略每个奇数字节的解决方案,因为它基本上是相同的,不太奇怪的编码事情正在发生(虽然这可能更明确到真正发生的事情:UTF-8内的UTF-8)。