C#按指定长度分割字符串

 

  这几天学习分析声音的波形数据,接收到的是十六进制的数据,需要将数据转换成十进制再绘图,这个过程涉及到字符串的分割,正好可以促进自己对C#相关知识的学习。说到分割字符串,我首先想到的是Split,但根据本例分割要求无法直接使用,需要进行一些处理。通过比较,我觉得常用于截取字符串的substring函数可以较方便的解决该问题,故记录下来方便与大家交流、学习。(相信一定有更好的处理方法,希望各位不吝赐教)


一.该程序的主要目的/功能

原数据如下图所示(十六进制数据):

原数据4byte表示一个数(即图中第一个数是7E51,第二个是75BA……),需要将原数据

按指定长度(4byte)分割成新的字符串,然后转化为十进制的数:

运行界面:

/*左边文本框是十六进制的原数据,右边是按长度为4(byte)分割后转化得到的相应的十进制数*/

二.程序代码

  1 using System;
  2 using System.Text;
  3 using System.Windows.Forms;
  4 using System.IO;
  5 using System.Text.RegularExpressions;
  6
  7 namespace StringOperate
  8 {
  9     public partial class Form1 : Form
 10     {
 11         public Form1()
 12         {
 13             InitializeComponent();
 14         }
 15
 16         /// <summary>
 17         /// 去掉字符串中的空格、回车和换行,然后按指定长度进行分割
 18         /// </summary>
 19         /// <param name="str">待处理的字符串</param>
 20         /// <returns></returns>
 21         static string[] strProcess(string str)
 22         {
 23             string strProcessed;
 24             string pass = @"[\t\r\n\s]";
 25             strProcessed = Regex.Replace(str, pass, "");  //去掉、回车、换行、空格
 26             int strLength = strProcessed.Length;          //统计经处理后的字符长度
 27             //判断待处理的字符串长度是否符合要求,并给出提示
 28             if (strLength % 4 != 0)
 29             {
 30                 int absenceNum = 4-strLength % 4;
 31                 string notification = $"注意:请检查数据是否完整!\r\n[提示:数据似乎缺少{absenceNum}位数字数符]";
 32                 MessageBox.Show(notification, "Tips", MessageBoxButtons.OK, MessageBoxIcon.Information);
 33             }
 34             int byteLength = strProcessed.Length / 4;       //统计分割后字符数组长度,数组中每个元素长度为四个字节
 35             string[] strArrayH = new string[byteLength];    //存放十六进制字符串
 36             int[] dateDecimal = new int[byteLength];        //存放转换后的十进制数据
 37             //将字符串分割为长度为4的字符数组
 38             for (int i=0;i<(byteLength);i=i+1)
 39             {
 40                 try
 41                 {
 42                     strArrayH[i]= strProcessed.Substring(4*i,4);//i-起始位置,4-子串长度
 43                 }
 44                 catch (Exception e)
 45                 {
 46                     MessageBox.Show(e.ToString(),"异常提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
 47                     continue;
 48                 }
 49             }
 50             return strArrayH;
 51         }
 52
 53         private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
 54         {
 55             string mydate;
 56             OpenFileDialog Ofdlg = new OpenFileDialog();
 57             openFileDialog1.Filter = "Word工作簿97-2003(*.doc)|*.doc|txt files (*.txt)|*.txt|All files (*.*)|*.*";
 58             openFileDialog1.FileName = "default";
 59             openFileDialog1.FilterIndex = 2;
 60             openFileDialog1.Title = "请选择待处理的数据文本"; //对话框的标题
 61
 62             if (openFileDialog1.ShowDialog()==DialogResult.OK)
 63             {
 64                 FileStream myfile = new FileStream(openFileDialog1.FileName,FileMode.Open,FileAccess.Read);
 65                 //使用System.Text.Encoding.Defaul告诉StreamReader采用目前操作系统的编码,避免出现乱码
 66                 StreamReader SR = new StreamReader(myfile,Encoding.Default);
 67                 mydate = SR.ReadToEnd();
 68                 try
 69                 {
 70                     textBox1.Text = mydate;
 71                     SR.Close();
 72                 }
 73                 catch (Exception ex)
 74                 {
 75                     MessageBox.Show("打开文件出错:" + ex.Message);
 76                 }
 77             }
 78         }
 79
 80         //将文本按指定长度分割
 81         private void 分割字符串ToolStripMenuItem_Click(object sender, EventArgs e)
 82         {
 83             textBox2.Text = "";
 84             string myContentBefore;
 85             string[] myContentAfter;
 86             myContentBefore = textBox1.Text.Trim();
 87             myContentAfter = strProcess(myContentBefore);
 88             int[] dateDecimal = new int[myContentAfter.Length];
 89             for (int i = 0; i < myContentAfter.Length; i++)
 90             {
 91                 try
 92                 {
 93                     dateDecimal[i] = Convert.ToInt32(myContentAfter[i], 16);
 94                 }
 95                 catch (Exception ex)
 96                 {
 97                     MessageBox.Show(ex.ToString(),"提示");
 98                     continue;
 99                 }
100                 finally
101                 {
102                     /*
103                      * textBox2.Text = (textBox2.Text + " " + dateDecimal[i].ToString()).Trim();
104                      * textBox2.Text += dateDecimal[i].ToString() + " ";
105                      * 当数据较多时,上面两种给textBox的赋值方式响应较慢,程序可能出现假死
106                      * 需要频繁更新TextBox(追加文本)时,AppendText能够稳定的即时更新,而且高效
107                      */
108                     textBox2.AppendText(dateDecimal[i].ToString()+" ");
109                 }
110             }
111             textBox2.Text = textBox2.Text.TrimEnd();
112
113         }
114
115         //清空textbox1的内容
116         private void 清除text1ToolStripMenuItem_Click(object sender, EventArgs e)
117         {
118             textBox1.Text = "";
119         }
120
121         //清空textbox2的内容
122         private void 清除text2ToolStripMenuItem_Click(object sender, EventArgs e)
123         {
124             textBox2.Text = "";
125         }
126
127         private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
128         {
129             StreamWriter mySteam;
130             SaveFileDialog Sfdlg = new SaveFileDialog();
131             saveFileDialog1.Filter= " Word文档97-2003(*.doc)|*.doc|txt files(*.txt)|*.txt|Excel工作簿97-2003(*.xls)|*.xls|All files(*.*)|*.*";
132             saveFileDialog1.FilterIndex = 2;                    //设置默认文件类型
133             saveFileDialog1.FileName = "default1";                //设置文件的默认名称
134             saveFileDialog1.RestoreDirectory = true;            //记忆上次打开位置
135             if (saveFileDialog1.ShowDialog()== DialogResult.OK)
136             {
137                 mySteam = new StreamWriter(saveFileDialog1.FileName);
138                 mySteam.Write(textBox2.Text.Trim());
139                 //使用Flush()方法将所有信息从基础缓冲区移动到其目标或清除缓冲区,或者同时执行这两种操作
140                 mySteam.Flush();
141                 mySteam.Close();
142             }
143         }
144     }
145 }

三.涉及的知识点

1.分割字符串——Substring(int startIndex, int length)

  由于需要按4个字节长度来分割字符串,而原数据是每两个字节就有一个空格,所以无法直接通过Split方法进行分割。我想到了两种思路:①去掉第1、3、5、7……个空格以及回车、换行和制表字符,然后使用Split分割字符串;②去掉所有空格、回车、换行和制表符,然后通过循环取字符串的子串的方式而达到‘分割’字符串到字符数组的目的。我觉得第二种方法的思路更简单,所以采用的是第二种方法。(int startIndex——开始截取子串的位置,int length——子字符串的长度)

2.数据访问——openFileDialog & saveFileDialog

  博客园介绍这方面知识的的文章很多,写的也非常好,这里就不再赘述。

3.Convert类 ——ToInt32(string,IFormatProvider)

  使用指定的区域性特定格式信息,将数字的指定 String 表示形式转换为等效的 32 位有符号整数。如本例中Convert.ToInt32(string,16)——把十六进制的数字的字符串转换为效的 32 位有符号整数(十进制)。详细用法可参考Microsoft官网的.net开发文档:Convert类Convert.ToInt32(string,IFormatProvider)方法

  写得比较匆忙,欢迎大家批评指正。

C#按指定长度分割字符串的更多相关文章

  1. C#利用substring按指定长度分割字符串

    这几天学习分析声音的波形数据,接收到的是十六进制的数据,需要将数据转换成十进制再绘图,这个过程涉及到字符串的分割,正好可以促进自己对C#相关知识的学习.说到分割字符串,我首先想到的是Split,但根据 ...

  2. asp.net截取指定长度的字符串内容

    /// <summary> /// 用于截取指定长度的字符串内容 /// </summary> /// <param name="sString"&g ...

  3. SQLServer中查询的数字列前面补0返回指定长度的字符串

    SQLServer中查询的数字列前面补0返回指定长度的字符串: 如: 角本如下: /****** Script for SelectTopNRows command from SSMS ******/ ...

  4. 随机生成指定长度字符字符串(C语言实现)

    相关函数 srand(), rand()头文件#include<stdlib.h> 定义函数 int rand(void) 函数说明 rand()会返回一随机数值,范围在0至RAND_MA ...

  5. 在smarty模板中截取指定长度的字符串

    在smarty模板中截取指定长度的字符串,可使用truncate这个插件. 用法: {{$data.value|truncate:28:'...'}} 28个字节14个字数输出,多余部分输出...,一 ...

  6. BUGFIX 09 - 记一次Java中String的split正则表达式匹配 - 引发`OutOfMemoryError: Java heap space`的oom异常 排查及解决 -Java根据指定分隔符分割字符串,忽略在引号里面的分隔符

    问题简述 说白了,Java根据指定分隔符分割字符串,忽略在引号(单引号和双引号)里面的分隔符; oom压测的时候,正则匹配"(?=(?:[^\"]*\"[^\" ...

  7. php随机生成指定长度的字符串 可以固定数字 字母 混合

    php 生成随机字符串 可以指定是纯数字 还是纯字母 或者混合的. 可以指定长度的. function rand_zifu($what,$number){ $string=''; for($i = 1 ...

  8. C#指定长度截取字符串 并进行拼接。

    需求:有一个字符串需要按照指定长度拆分出来,然后在增加一个字符串拼接上. /// <summary> /// 字符串截取并拼接 /// </summary> /// <p ...

  9. MySQL 返回指定长度的字符串

    今天在做 iblog 项目时,有一个需求是,从 MySQL 返回某个字段的值要时要指定长度,上网搜到的方法是使用 MySQL 的字符串处理函数,如 left(str, length),right(st ...

随机推荐

  1. kernel thread vs user thread

    The most important difference is they use different memory, the kernel mode thread can access any ke ...

  2. set基本用法-----2

    #include<cstdio> #include<iostream> #include<cstdlib> #include<cmath> #inclu ...

  3. C# 的 String.CompareTo Equals和==的比较

    String.CompareTo 语法 public int CompareTo(    string strB) 返回值 小于 0,实例小于参数 strB: 0,实例等于参数 strB: 大于 0, ...

  4. rpm安装与卸载命令

    linux删除目录(文件夹):rmdir 目录名(目录需非空):直接删除可用: rm -rf 目录名 ,不需考虑是否为空 SecureCRT上传文件:rz  ,下载文件:sz rpm 安装:rpm - ...

  5. HDU 6229 Wandering Robots(2017 沈阳区域赛 M题,结论)

    题目链接  HDU 6229 题意 在一个$N * N$的格子矩阵里,有一个机器人. 格子按照行和列标号,左上角的坐标为$(0, 0)$,右下角的坐标为$(N - 1, N - 1)$ 有一个机器人, ...

  6. Light oj 1125 - Divisible Group Sums (dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1125 题意: 给你n个数,q次询问,每次询问问你取其中m个数是d的整数倍的方案 ...

  7. [HAOI2011]Problem b&&[POI2007]Zap

    题目大意: $q(q\leq50000)$组询问,对于给定的$a,b,c,d(a,b,c,d\leq50000)$,求$\displaystyle\sum_{i=a}^b\sum_{j=c}^d[\g ...

  8. springboot集成PageHelper,支持springboot2.0以上版本

    第一步:pom文件还是需要引入依赖 <!--mybatis的分页插件--> <dependency> <groupId>com.github.pagehelper& ...

  9. centos7.3 开放端口 防火墙端口

    1. 查看已打开的端口 # netstat -anp 2. 查看想开的端口是否已开 # firewall-cmd --query-port=666/tcp 若此提示 FirewallD is not ...

  10. flannel无法跨主机ping通容器的解决方式

    前几天,出现了无法跨主机ping通容器的情况,导致一个node机网络中断,无法访问,排查过程如下. 首先确认,宿主机node2是可以ping通容器 [root@node2 ~]# ping 10.1. ...