字节数组转换语句C#

时间:2015-02-03 17:59:05

标签: c# arrays switch-statement

我正在使用下面的for循环将字节数组的内容写入屏幕和文本文件。数组中的第3列与属性有关,而不是显示属性编号,我想添加一个带有给定数字的switch语句,并用文本交换它。

foreach (ManagementObject FailData in FailDataSet)
{
    Byte[] data =(Byte[])FailData.Properties["VendorSpecific"].Value;
    var sb = new StringBuilder();
    for (int i = 0; i < data[0] - 1; i++)
    {
        for (int j = 0; j < 12; j++)
        {  
            richTextBox2.Text = richTextBox2.Text + data[i * 12 + j] + "\t";
            sb.Append(data[i * 12 + j] + "\t");
        }
        richTextBox2.Text = richTextBox2.Text + "\n";
        sb.AppendLine();
    }
    String title = "Unknw\tUnknw\tAttribute\tStatus\tUnknw\tValue\tWorst\tRaw\t\tUnknw\r\n";
    File.WriteAllText(@"C:\Users\Desktop\WriteText1.txt", title + sb.ToString();
}

2 个答案:

答案 0 :(得分:0)

这是一种方法:

foreach (ManagementObject FailData in FailDataSet)
{
    Byte[] data =(Byte[])FailData.Properties["VendorSpecific"].Value;
    var sb = new StringBuilder();
    for (int i = 0; i < data[0] - 1; i++)
    {
        for (int j = 0; j < 12; j++)
        {  
            string text = data[i * 12 + j];
            if (j == 2)
                text = GetText(text);
            sb.Append(text + "\t");
        }
        sb.AppendLine();
    }
    richTextBox2.Text = sb.ToString();
    String title = "Unknw\tUnknw\tAttribute\tStatus\tUnknw\tValue\tWorst\tRaw\t\tUnknw\r\n";
    File.WriteAllText(@"C:\Users\Desktop\WriteText1.txt", title + sb.ToString());
}

请注意,最后一行代码中缺少右括号。

功能可能是这样的:

private string GetText(string numberText)
{
    int number;
    if (!int.TryParse(numberText, out number))
        return string.Empty; // or "invalid" or whatever

    switch (number)
    {
        case 1: return "one";
        case 2: return "two";
        default: return "other";
    }
}

答案 1 :(得分:0)

如果我理解正确,byte[]的格式如下:

  
      
  • [0]:数据行数(加1,真的吗?)
  •   
  • [1] .. [12]:第一行数据
  •   
  • [13] .. [24]:第二行数据
  •   
  •   

如果是这样,那么我要指出的第一件事就是你的程序中有一个错误。您正在索引从索引0处的元素开始的数据,但当然具有行计数。您应该在计算的索引中加1,以便考虑到这一点。

另外,虽然数据中的行数实际上可能是行数加1,但是对于行计数器循环比较需要减1,似乎更可信的是,这只是代码中的另一个错误。 / p>

考虑到这些事情,听起来像你想要的是这样的事情:

foreach (ManagementObject FailData in FailDataSet)
{
    Byte[] data =(Byte[])FailData.Properties["VendorSpecific"].Value;
    var sb = new StringBuilder();
    for (int i = 0; i < data[0]; i++)
    {
        for (int j = 0; j < 12; j++)
        {
            int dataIndex = i * 12 + j + 1;
            string textForColumn = j == 2 ?
                GetAttributeText(data[dataIndex]) : data[dataIndex].ToString();

            richTextBox2.Text = richTextBox2.Text + textForColumn + "\t";
            sb.Append(textForColumn + "\t");
        }
        richTextBox2.Text = richTextBox2.Text + "\n";
        sb.AppendLine();
    }
    String title = "Unknw\tUnknw\tAttribute\tStatus\tUnknw\tValue\tWorst\tRaw\t\tUnknw\r\n";
    File.WriteAllText(@"C:\Users\Desktop\WriteText1.txt", title + sb.ToString();
}

其中:

static string GetAttributeText(byte value)
{
    switch (value)
    {
    case 0:
        return "First Attribute Text";
    case 1:
        return "Second Attribute Text";
    case 2:
        return "Third Attribute Text";
    default:
        return "<unknown attribute>";
    }
}

请注意,意见因switch声明的可读性而异。以上也可以使用字典来实现:

static readonly Dictionary<byte, string> _byteToAttributeText =
    new Dictionary<byte, string>()
    {
        { 0, "First Attribute Text" },
        { 1, "Second Attribute Text" },
        { 2, "Third Attribute Text" },
    };

static string GetAttributeText(byte value)
{
    string text;

    if (!_byteToAttributeText.TryGetValue(value, out text))
    {
        return "<unknown attribute>";
    }

    return text;
}