So I've found a few examples but none that are exactly as I want it (close though)
example of what i'm looking for
byte[] array = { 0x02, 0x64, 0x40, 0x40, 0x03 };
string text = SomeMagicalMethod(array);
//displays <STX>FOO<ETX>
At one point I had a dictionary with the non-printable character values and the <...> stuff in it, but combining the 2 strings is killing my head. I currently have this, but it ASCIIEncoding takes out all Control characters.
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; })
);
}
EDIT Using NUnit i ran the answered codes against these tests. The last one has one value that is out of the scope of 0x7F. Although the code this will be used in should NOT have that, it is better to be safe then sorry.
[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");
}
}
"<STX>"?0x64 0x40 0x40in ASCII is actually"d@@",0x46 0x4F 0x4FisFOO.