C# 从文件中强制转换字符串以缩短

C# 从文件中强制转换字符串以缩短,c#,C#,我有两个问题 第一个问题… 我正在使用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

我有两个问题

第一个问题…

我正在使用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])));
        }
操作码接收字符串的参数,Short。例如,第一个是Test,0x01

问题是,由于某种原因,它无法解析。它说输入字符串的格式不正确,为什么

第二个问题..

我有一张单子

    public static List<Opcode> SendOpcodes = new List<Opcode>();
现在。。我希望只使用操作码的名称就可以得到简短的代码。例如,如果我在该列表中有一个项目:

Migrate 0x0B  (Migrate is the string, 0x0B is the short)
我只想通过使用迁移名称来获取0x0B,如何才能做到这一点

谢谢

只要更换

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

有关详细信息:

只需更换即可

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


有关详细信息:

要将十六进制字符串转换为短字符串,可以使用以下重载:

short myShort = Convert.ToInt16(hexString, 16);
这个函数的文档是,有一篇文章讨论十六进制和数值之间的转换

因此,您的代码在第一部分应该如下所示:

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
}
要获取名为“迁移”的
操作码,您可以添加对
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");

您可以获得Linq、lambdas和Linq的一般介绍。

要将十六进制字符串转换为短字符串,可以使用以下重载:

short myShort = Convert.ToInt16(hexString, 16);
这个函数的文档是,有一篇文章讨论十六进制和数值之间的转换

因此,您的代码在第一部分应该如下所示:

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
}
要获取名为“迁移”的
操作码,您可以添加对
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");

你可以大致了解Linq和lambdas以及Linq。

你应该将这两个问题分成两个问题=]@Sean好吧,我不想问两个问题,所以当他们在这里时,为什么不同时回答这两个问题呢?还有,你的评论有点没用。我只是在别人之前说的。规则是每个…一个问题。。。。问题。@Sean哦,对不起。我是新来的!short.Parse(splitop[0])应该是short.Parse(splitop[1])。splittop[0]是“测试”,您应该将其分为两个问题=]@Sean好吧,我不想问两个问题,所以当他们在这里时,为什么不同时回答这两个问题呢?还有,你的评论有点没用。我只是在别人之前说的。规则是每个…一个问题。。。。问题。@Sean哦,对不起。我是新来的!short.Parse(splitop[0])应该是short.Parse(splitop[1])。splittop[0]为“测试”