C#按指定长度分割字符串
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#按指定长度分割字符串的更多相关文章
- C#利用substring按指定长度分割字符串
这几天学习分析声音的波形数据,接收到的是十六进制的数据,需要将数据转换成十进制再绘图,这个过程涉及到字符串的分割,正好可以促进自己对C#相关知识的学习.说到分割字符串,我首先想到的是Split,但根据 ...
- asp.net截取指定长度的字符串内容
/// <summary> /// 用于截取指定长度的字符串内容 /// </summary> /// <param name="sString"&g ...
- SQLServer中查询的数字列前面补0返回指定长度的字符串
SQLServer中查询的数字列前面补0返回指定长度的字符串: 如: 角本如下: /****** Script for SelectTopNRows command from SSMS ******/ ...
- 随机生成指定长度字符字符串(C语言实现)
相关函数 srand(), rand()头文件#include<stdlib.h> 定义函数 int rand(void) 函数说明 rand()会返回一随机数值,范围在0至RAND_MA ...
- 在smarty模板中截取指定长度的字符串
在smarty模板中截取指定长度的字符串,可使用truncate这个插件. 用法: {{$data.value|truncate:28:'...'}} 28个字节14个字数输出,多余部分输出...,一 ...
- BUGFIX 09 - 记一次Java中String的split正则表达式匹配 - 引发`OutOfMemoryError: Java heap space`的oom异常 排查及解决 -Java根据指定分隔符分割字符串,忽略在引号里面的分隔符
问题简述 说白了,Java根据指定分隔符分割字符串,忽略在引号(单引号和双引号)里面的分隔符; oom压测的时候,正则匹配"(?=(?:[^\"]*\"[^\" ...
- php随机生成指定长度的字符串 可以固定数字 字母 混合
php 生成随机字符串 可以指定是纯数字 还是纯字母 或者混合的. 可以指定长度的. function rand_zifu($what,$number){ $string=''; for($i = 1 ...
- C#指定长度截取字符串 并进行拼接。
需求:有一个字符串需要按照指定长度拆分出来,然后在增加一个字符串拼接上. /// <summary> /// 字符串截取并拼接 /// </summary> /// <p ...
- MySQL 返回指定长度的字符串
今天在做 iblog 项目时,有一个需求是,从 MySQL 返回某个字段的值要时要指定长度,上网搜到的方法是使用 MySQL 的字符串处理函数,如 left(str, length),right(st ...
随机推荐
- 洛谷P3803 【模板】多项式乘法(FFT) 【fft】
题目 这是一道FFT模板题 输入格式 给定一个n次多项式F(x),和一个m次多项式G(x). 请求出F(x)和G(x)的卷积. 输出格式 第一行2个正整数n,m. 接下来一行n+1个数字,从低到高表示 ...
- shell 条件表达式
1.条件测试的常用语法如下 1.test 测试表达式 2.[ 测试表达式 ] #两边需要有空格 3.[[ 测试表达式 ]] 4.(( 测试表达式 )) 说明: 第一种和第二种是等价的,第三种是扩展的t ...
- 零基础学习Mahout之-----搭建单机环境
一.Mahout是什么? Mahout是Apache的一个开源项目(http://mahout.apache.org/),提供了机器学习领域的若干经典算法,以便开发人员快速构建机器学习和数据挖掘方面的 ...
- XPath gramma
XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. XML 实例文档 我们将在下面的例子中使用这个 XML 文档. & ...
- hdu 5972 Regular Number 字符串Shift-And算法 + bitset
题目链接 题意 给定两个串\(S,T\),找出\(S\)中所有与\(T\)匹配的子串. 这里,\(T\)的每位上可以有若干(\(\leq 10\))种选择,匹配的含义是:对于\(S\)的子串的每一位, ...
- C++中STL常用容器的区别(转)
我们常用到的STL容器有vector.list.deque.map.multimap.set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我 ...
- svn报“Previous operation has not finished; run 'cleanup' if it was interrupted”的错误
-.叙述 今天需要更新接口文檔,所以就update了一下,結果報了如下錯誤: Error : Previous operation has not finished; run 'cleanu ...
- codevs——1267 老鼠的旅行(棋盘DP)
1267 老鼠的旅行 2012年CCC加拿大高中生信息学奥赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description ...
- 解决百度ueditor配置上传目录为外部目录时,项目启动访问不到图片的问题。
如图所示,公司项目用到了百度的ueditor,配置的上传目录并不在项目根目录下,而是在外部目录中.于是在上传图片时,出现了无法获取图片的问题. 解决方法:添加该目录至tomcat项目部署目录中,如下图 ...
- 2016北京集训测试赛(十)Problem A: azelso
Solution 我们把遇到一个旗子或者是遇到一个敌人称为一个事件. 这一题思路的巧妙之处在于我们要用\(f[i]\)表示从\(i\)这个事件一直走到终点这段路程中, \(i\)到\(i + 1\)这 ...