2013-09-13 2 views
0

У меня есть 2 вопроса!Кастинг короткой строки из файла

Первый вопрос ...

Я загрузить строку из файла с помощью StreamReader и WebRequest. Предположим, что я получил следующее:

Test=0x01 
Stack=0x03 
Recv=0x0B 

Теперь я делаю следующее, чтобы разделить их все.

var result = Regex.Split(file, "\r\n|\r|\n"); 

     foreach (string op in result) 
     { 
      string[] splitop = Regex.Split(op, "="); 
      RecvOpcodes.Add(new Opcode(splitop[1], short.Parse(splitop[0]))); 
     } 

Код операции принимает аргумент строки, короткий. Например, первым будет Test, 0x01.

Проблема в том, что он почему-то не разбирается. Он говорит, что входная строка не в правильном формате, почему?

Второй вопрос ..

У меня есть список.

public static List<Opcode> SendOpcodes = new List<Opcode>(); 

Opcode - это класс строк, короткий.

public class Opcode 
{ 
    private string name; 
    private short header; 

    public Opcode(string nm, short hd) 
    { 
     name = nm; 
     header = hd; 
    } 
} 

Теперь .. Я хочу иметь возможность получить короткое замыкание только с использованием имени кода операции. Например, если у меня есть пункт в этом списке:

Migrate 0x0B (Migrate is the string, 0x0B is the short) 

Я хочу, чтобы получить 0x0B только с помощью имени Migrate, как я могу это сделать?

Спасибо!

+1

Вы должны разделить это на два вопроса =] – Sean

+0

@Sean Ну, я не хочу перегружать, задавая 2 вопроса, поэтому пока они здесь - почему бы не ответить на оба? Кроме того, ваш комментарий бесполезен. – user2714359

+0

Я просто говорил это раньше, чем кто-то другой. Правила - один вопрос на .... Вопрос. – Sean

ответ

3

Просто замените

RecvOpcodes.Add(new Opcode(splitop[1], short.Parse(splitop[0]))); 

с

RecvOpcodes.Add(new Opcode(splitop[1], Convert.ToInt16(splitop[0],16))); 

Для получения дополнительной информации: Convert Class

1

Для преобразования шестнадцатеричной строки в короткий, вы можете использовать следующую перегрузку:

short myShort = Convert.ToInt16(hexString, 16); 

Документация для этой функции - here, и есть статья, которая посвящена преобразованию между шестнадцатеричными и числовыми значениями here.

Так что ваш код должен выглядеть следующим образом для первой части:

var result = Regex.Split(file, "\r\n|\r|\n"); 

foreach (string op in result) 
{ 
    string[] splitop = Regex.Split(op, "="); 
    RecvOpcodes.Add(new Opcode(splitop[0], Convert.ToInt16(splitop[1], 16))); // splitop[0] will contain Test, Stack and Recv; splitop[1] will contain 0x01, 0x03, 0x0B 
} 

Чтобы получить Opcode с именем Migrate, вы можете добавить ссылку на System.Linq и использовать .First() метод:

using System.Linq; 

..... 

public static List<Opcode> SendOpcodes = new List<Opcode>(); 

..... 

SendOpcodes.Add(new Opcode("Migrate", 11)); 

Opcode desiredOpcode = SendOpcodes.First(opcode => opcode.Name == "Migrate"); 

Если вы не знаете, есть ли в списке Opcode, вы можете использовать метод FirstOrDefault, а затем проверить его значение null (значение по умолчанию для определяемого пользователем класса нуль):

Opcode desiredOpcode = SendOpcodes.FirstOrDefault(opcode => opcode.Name == "Migrate"); 

if (desiredOpcode != null) 
{ 
    // do what you want next in here 
} 

Вы можете получить введение в Linq и лямбды here и Linq в общем here.

Смежные вопросы