2011-12-08 50 views
5

我正在做一个窗体应用程序是Visual C#。我有一个文本框,用户必须输入一个数字和一个大写字母,例如“9D”。字符串文字到字节

我需要做的就是把那封信到一个字节数组作为一个字节......所以在我的字节数组它会:

array[index] = 0x9D 

我知道,文本框类表示9D作为一个字符串。我很困惑如何使它成为一个字面字节(9D)并将其粘贴在数组中。

新的.NET。所以任何帮助将不胜感激。我查看了System.Convert类,并没有看到任何我可以使用的东西。

+0

我假设你要正确对待0x9D拥有157是否正确? –

+0

是的,这是正确的。 – brazc0re

+0

您可以使用[System.Convert.ToByte](http://msdn.microsoft.com/en-us/library/c7xhf79k.aspx)方法,指定16作为您的基地将十六进制字符串转换为字节。 – pstrjds

回答

6

使用Byte.Parse(string, NumberStyles)

byte b = Byte.Parse(text, NumberStyles.HexNumber); 

或者Byte.TryParse(string, NumberStyles, IFormatProvider, out Byte)以更加妥善地处理无效的输入。

+0

谢谢。 Byte.Parse(text,NumberStyles.HexNumber)正是我想要的! – brazc0re

+2

@ brazc0re - 我强烈建议您使用TryParse,否则如果字符串无法转换为基本16位数字,您的应用程序将会崩溃。 –

+0

谢谢你的建议Ramhound。我将使用TryParse并用try来处理错误,并据此进行处理。 – brazc0re

1

使用Byte.Parse将字符串解析为Byte

array[index] = Byte.Parse("9D", NumberStyles.AllowHexSpecifier); 

注意,具有前缀0x会导致解析失败,所以你可能想,如果它存在剥离出来。

+0

谢谢!这个解决方案也有效。 – brazc0re

4

如果你想让它做得更快一点,并允许在数字前面加'0x',你可以使用Convert.ToByte("0x9D", 16)。在我的有限测试中,Convert.ToByteByte.Parse的两倍

您也可以使用简单Regex验证输入。这样你就知道在调用任何方法解析或转换它之前,字符串将解析。

// Checks that the string is either 2 or 4 characters and contains only valid hex 
var regex = new Regex(@"^(0x)*[a-fA-F\d]{2}$") 

测试代码:

const int count = 100000; 
var data = "9D"; 
var sw = new Stopwatch(); 
sw.Reset(); 

byte dest = 0; 
sw.Start(); 
for(int i=0; i < count; ++i) 
{ 
    dest = Byte.Parse(data, NumberStyles.AllowHexSpecifier); 
} 
sw.Stop(); 
var parseTime = sw.ElapsedMilliseconds; 
sw.Reset(); 
sw.Start(); 
for(int i=0; i < count; ++i) 
{ 
    dest = Convert.ToByte(data, 16); 
} 
sw.Stop(); 
var convertTime = sw.ElapsedMilliseconds;