gpt4 book ai didi

c# - 带控制字符的字节数组到字符串

转载 作者:太空狗 更新时间:2023-10-30 00:25:12 27 4
gpt4 key购买 nike

所以我找到了一些例子,但没有一个是完全我想要的(尽管接近)

我正在寻找的例子

byte[] array = { 0x02, 0x64, 0x40, 0x40, 0x03 };
string text = SomeMagicalMethod(array);
//displays <STX>FOO<ETX>

有一次我有一本字典,其中包含不可打印的字符值和 <...> 内容,但是将这两个字符串组合起来让我头疼。我目前有这个,但它 ASCIIEncoding 取出所有控制字符。

public static void Add(this TextBox tb, byte[] array)
{
string input = System.Text.ASCIIEncoding.ASCII.GetString(array);

Regex.Replace( input ,
@"\p{Cc}" ,
a => string.Format( "[{0:X2}]" , (byte)a.Value[0] )
) ;
Add(tb, input);

}

public static void Add(this TextBox tb, string text)
{
text += ENTER;
tb.Dispatcher.Invoke( DispatcherPriority.Background,
new Action(delegate() { tb.Text += text; })
);
}

编辑使用 NUnit 我针对这些测试运行了已回答的代码。最后一个有一个值超出了 0x7F 的范围。虽然将使用它的代码不应该有那个,但安全总比抱歉好。

[TestFixture]
public class StringExtensionsTest
{
[Test]
public void SingleByteControlCharacterTest()
{
AssertSingleByte(0x00, "<NUL>"); AssertSingleByte(0x01, "<SOH>");
AssertSingleByte(0x02, "<STX>"); AssertSingleByte(0x03, "<ETX>");
AssertSingleByte(0x04, "<EOT>"); AssertSingleByte(0x05, "<ENQ>");
AssertSingleByte(0x06, "<ACK>"); AssertSingleByte(0x07, "<BEL>");
AssertSingleByte(0x08, "<BS>" ); AssertSingleByte(0x09, "<HT>" );
AssertSingleByte(0x0A, "<LF>" ); AssertSingleByte(0x0B, "<VT>" );
AssertSingleByte(0x0C, "<FF>" ); AssertSingleByte(0x0D, "<CR>" );
AssertSingleByte(0x0E, "<SO>" ); AssertSingleByte(0x0F, "<SI>" );

AssertSingleByte(0x10, "<DLE>"); AssertSingleByte(0x11, "<DC1>");
AssertSingleByte(0x12, "<DC2>"); AssertSingleByte(0x13, "<DC3>");
AssertSingleByte(0x14, "<DC4>"); AssertSingleByte(0x15, "<NAK>");
AssertSingleByte(0x16, "<SYN>"); AssertSingleByte(0x17, "<ETB>");
AssertSingleByte(0x18, "<CAN>"); AssertSingleByte(0x19, "<EM>" );
AssertSingleByte(0x1A, "<SUB>"); AssertSingleByte(0x1B, "<ESC>");
AssertSingleByte(0x1C, "<FS>" ); AssertSingleByte(0x1D, "<GS>" );
AssertSingleByte(0x1E, "<RS>" ); AssertSingleByte(0x1F, "<US>" );
AssertSingleByte(0x7F, "<DEL>");
}
private void AssertSingleByte(byte value, string expected)
{
byte[] array = new byte[]{value};
var actual = array.asciiOctets2String();
Assert.AreEqual(expected, actual, "Didn't print the epxected result");
}

[Test]
public void SingleCharacterTest()
{
for (byte i = 0x20; i < 0x7F; i++)
{
AssertSingleByte(i, char.ToString((char)i));
}
}

[Test]
public void SimpleTestTogether()
{
byte[] array = {0x02, 0x46,0x4F, 0x4F, 0x03};
string expected = "<STX>FOO<ETX>";
string actual = array.asciiOctets2String();
Assert.AreEqual(expected, actual, "Simple test failed");
}
[Test]
public void BigTest()
{
byte[] array = {
0x00, 0x7F, 0x03, 0x52, 0x00, 0x00, 0x2F, 0x5F, 0x20, 0x0F, 0x43, 0x41, 0x52, 0x44, 0x48, 0x4F,
0x4C, 0x44, 0x45, 0x52, 0x2F, 0x56, 0x49, 0x53, 0x41, 0x9F, 0x1F, 0x07, 0x30, 0x30, 0x30, 0x30,
0x30, 0x30, 0x30};
string expected = "<NUL><DEL><ETX>R<NUL><NUL>/_ <SI>CARDHOLDER/VISA?<US><BEL>0000000";
string actual = array.asciiOctets2String();

Assert.AreEqual(expected, actual, "BigTest Failed");
}
}

最佳答案

你必须创建一个你想要的控制字符的表格,例如:

Dictionary<byte, string> controlCodes = new Dictionary<byte, string>
{
{ 0x00, "<NUL>" },
{ 0x01, "<SOH>" },
{ 0x02, "<STX>" },
{ 0x03, "<ETX>" },
...
}

您可以使用 this Wikipedia page构建完整列表。

那么构建你的就很简单了:

var output = String.Join(
string.Empty,
array.Select(b =>
controlCodes.ContainsKey(b)
? controlCodes[b]
: Encoding.ASCII.GetString(new[] { b })));

当然,这可以得到显着改善。这样的事情会更有效率:

string str = string.Empty;
int i = 0, j = 0;
while (i < array.Length && j > -1)
{
j = Array.FindIndex(array, i, b => controlCodes.ContainsKey(b));
if (j > -1)
{
if (j > i)
{
str += Encoding.ASCII.GetString(array, i, j - i);
}

str += controlCodes[array[j]];
i = j + 1;
}
else
{
str += Encoding.ASCII.GetString(array, i, array.Length - i);
}
}

return str;

关于c# - 带控制字符的字节数组到字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18498149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com