已回答 断开字符串并将其存储到数组中

已加入
2020年3月31日
留言内容
21
编程经验
Beginner
嗨,大家好
我有一个简单的问题。在下面的图片中,有一个文本框,其中包含数字和字母。
我想打破这个字符串,并将每个字母或数字存储在数组中。怎么做?
例如,文本框中的字符串是23A45E890,我希望它像array [0] = 2,array [1] = 3,array [2] = A ....依此类推
1.png


谢谢和最好的问候
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
String类具有ToCharArray方法,因此您只需在String对象上调用它即可。就是说,您甚至不必这样做,具体取决于您要如何使用数据。字符串对象是IEnumerable<Char>,这意味着您可以运行 前言 循环访问String以依次访问每个Char。如果您想随机访问,那么创建数组是一种方法。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,524
地点
悉尼,澳大利亚
编程经验
10+
您还可以使用其索引器访问字符串的各个字符。

你也可以我出于某种原因忘记了这一点。呼唤 ToCharArray 允许您设置字符以及获取字符,但是,如果只想获取它们,则直接使用索引器可能会更有效。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,928
地点
英国
编程经验
10+
同样指出,最简单,最有效的方法是使用字符串位置的每个索引,例如:
C#:
        private void button1_Click(object sender, EventArgs e)
        {
            string value = "23A45E890";
            for (int i = 0; i < value.Length; i++)
                Debug.WriteLine(value[i]);
        }
这将打印出每个字符。或者,由于所有这些无关紧要的废话而感到无聊时,您可能会变得更加复杂。

C#:
        internal char[] Char_Arr = { };
        private void button1_Click(object sender, EventArgs e)
        {
            Char_Arr = StrToArray("23A45E890");
        }
        internal char[] StrToArray(string value)
        {
            return value.ToArray();
        }
您甚至不需要该函数,但是例如,为了简单起见,只需在字符串上调用ToArray()即可满足您的需求。将其添加到您的按钮中,您可以看到返回结果之后的输出:
C#:
            foreach (char c in Char_Arr)
                Debug.WriteLine(c);
如果在Char_Arr上设置了一个断点,则将鼠标悬停在其上时可以看到其内容。如果需要,请签名签名进行调试。截屏 :

截图_16.jpg
 
已加入
2020年3月31日
留言内容
21
编程经验
Beginner
嗨,大家好
多谢您的回覆。其实我很困惑该怎么做?
我的主要任务是从文本框(i-e 2345J4567AS09843)获取输入,然后将每个字母分开,将其转换为十进制。之后,计算CRC字节,然后在另一个文本框中显示完整的数组

为了您的理解,请参见以下代码,我已经完成了什么以及需要做些什么

C#:
private void showSerialNo_Click(object sender, EventArgs e)
        {
            // from frame[0] to frame[5] data is fixed. Not entered by user
            byte slaveAddress = 1;
            byte functionCode = 16;
            ushort startAddress = 32768;
            ushort numberOfPoints = 10;

            byte[] frame = new byte[29];
            frame[0] = slaveAddress;
            frame[1] = functionCode;
            frame[2] = (byte)(startAddress >> 8);
            frame[3] = (byte)startAddress;
            frame[4] = (byte)(numberOfPoints >> 8);
            frame[5] = (byte)numberOfPoints;

            //frame[6] to frame[23] is the data entered by user in text box. which should be converterd to dec from ascii char
            frame[6] = 20;
            frame[7] = 50;
            frame[8] = 49;
            frame[9] = 48;
            frame[10] = 51;
            frame[11] = 48;
            frame[12] = 74;
            frame[13] = 49;
            frame[14] = 57;
            frame[15] = 49;
            frame[16] = 52;
            frame[17] = 69;
            frame[18] = 78;
            frame[19] = 48;
            frame[20] = 51;
            frame[21] = 57;
            frame[22] = 53;
            frame[23] = 55;

            //frame[24] to frame[26] these are always 0
            frame[24] = 0;
            frame[25] = 0;
            frame[26] = 0;

            // frame[27] to frame[28] are the result of CRC Sum
            byte[] checkSum = CRC16(frame);
            frame[27] = checkSum[0];
            frame[28] = checkSum[1];

            // currently data is displaying on console window. but i want to display it on another textbox.
            foreach (var item in frame)
            {
                Console.Write(string.Format("{0:X2} ", item));
            }
            Console.ReadKey();
        }

CRC计算的代码是
C#:
 private static byte[] CRC16(byte[] data) // Method to Calculate CRC Bytes
        {
            byte[] checkSum = new byte[2];
            ushort reg_crc = 0XFFFF;
            for (int i = 0; i < data.Length - 2; i++)
            {
                reg_crc ^= data[i];
                for (int j = 0; j < 8; j++)
                {
                    if ((reg_crc & 0x01) == 1)
                    {
                        reg_crc = (ushort)((reg_crc >> 1) ^ 0xA001);
                    }
                    else
                    {
                        reg_crc = (ushort)(reg_crc >> 1);
                    }
                }
            }
            checkSum[1] = (byte)((reg_crc >> 8) & 0XFF);
            checkSum[0] = (byte)(reg_crc & 0xFF);
            return checkSum;
        }

结果看起来像这样,我在控制台窗口上得到结果,但在文本框中需要它

result.png
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,533
地点
弗吉尼亚州切萨皮克
编程经验
10+
将问题分解为较小的问题。您的第一个问题是从字符串中取出每个字符。到目前为止你做了什么?上面显示了多种方法。你选了哪一个?尝试时发生了什么?

拥有所有字符后,它们自然就会将您的ASCII值还给您(如 @谢平(第5个帖子中的屏幕截图)。您需要做的就是在该数据上应用CRC算法。

Outputting the contents of your array is simply a matter of building a string and then setting the string in the text box. The best way to do this is to use a StringBuilder, but you could just keeping concatenating to a string.
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,928
地点
英国
编程经验
10+
我的主要任务是从文本框(i-e 2345J4567AS09843)获取输入,然后将每个字母分开,将其转换为十进制。
Regarding this. What is so different from string value = "23A45E890"; being equal to the text property of a control?
我也没有看到实现您已经收到的任何示例的任何尝试。

现在关于您的新问题。您开始询问一件事,现在您要询问另外三件事,这是完全不同的。请为您遇到的每个新问题打开新主题。例如如何转换为两倍,尽管快速搜索该论坛会发现很多答案。转换字节或使用字节也与您开始询问的问题无关。如果所有三个问题的代码都相同,则可以链接到其他帖子以供参考。我们这样做是为了避免混淆每个主题一个问题的主题。
 
最佳 底部