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


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

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

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

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

运行界面:

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

二.程序代码

 using System;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions; namespace StringOperate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} /// <summary>
/// 去掉字符串中的空格、回车和换行,然后按指定长度进行分割
/// </summary>
/// <param name="str">待处理的字符串</param>
/// <returns></returns>
static string[] strProcess(string str)
{
string strProcessed;
string pass = @"[\t\r\n\s]";
strProcessed = Regex.Replace(str, pass, ""); //去掉、回车、换行、空格
int strLength = strProcessed.Length; //统计经处理后的字符长度
//判断待处理的字符串长度是否符合要求,并给出提示
if (strLength % != )
{
int absenceNum = -strLength % ;
string notification = $"注意:请检查数据是否完整!\r\n[提示:数据似乎缺少{absenceNum}位数字数符]";
MessageBox.Show(notification, "Tips", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
int byteLength = strProcessed.Length / ; //统计分割后字符数组长度,数组中每个元素长度为四个字节
string[] strArrayH = new string[byteLength]; //存放十六进制字符串
int[] dateDecimal = new int[byteLength]; //存放转换后的十进制数据
//将字符串分割为长度为4的字符数组
for (int i=;i<(byteLength);i=i+)
{
try
{
strArrayH[i]= strProcessed.Substring(*i,);//i-起始位置,4-子串长度
}
catch (Exception e)
{
MessageBox.Show(e.ToString(),"异常提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
continue;
}
}
return strArrayH;
} private void 打开ToolStripMenuItem_Click(object sender, EventArgs e)
{
string mydate;
OpenFileDialog Ofdlg = new OpenFileDialog();
openFileDialog1.Filter = "Word工作簿97-2003(*.doc)|*.doc|txt files (*.txt)|*.txt|All files (*.*)|*.*";
openFileDialog1.FileName = "default";
openFileDialog1.FilterIndex = ;
openFileDialog1.Title = "请选择待处理的数据文本"; //对话框的标题 if (openFileDialog1.ShowDialog()==DialogResult.OK)
{
FileStream myfile = new FileStream(openFileDialog1.FileName,FileMode.Open,FileAccess.Read);
//使用System.Text.Encoding.Defaul告诉StreamReader采用目前操作系统的编码,避免出现乱码
StreamReader SR = new StreamReader(myfile,Encoding.Default);
mydate = SR.ReadToEnd();
try
{
textBox1.Text = mydate;
SR.Close();
}
catch (Exception ex)
{
MessageBox.Show("打开文件出错:" + ex.Message);
}
}
} //将文本按指定长度分割
private void 分割字符串ToolStripMenuItem_Click(object sender, EventArgs e)
{
textBox2.Text = "";
string myContentBefore;
string[] myContentAfter;
myContentBefore = textBox1.Text.Trim();
myContentAfter = strProcess(myContentBefore);
int[] dateDecimal = new int[myContentAfter.Length];
for (int i = ; i < myContentAfter.Length; i++)
{
try
{
dateDecimal[i] = Convert.ToInt32(myContentAfter[i], );
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(),"提示");
continue;
}
finally
{
/*
* textBox2.Text = (textBox2.Text + " " + dateDecimal[i].ToString()).Trim();
* textBox2.Text += dateDecimal[i].ToString() + " ";
* 当数据较多时,上面两种给textBox的赋值方式响应较慢,程序可能出现假死
* 需要频繁更新TextBox(追加文本)时,AppendText能够稳定的即时更新,而且高效
*/
textBox2.AppendText(dateDecimal[i].ToString()+" ");
}
}
textBox2.Text = textBox2.Text.TrimEnd(); } //清空textbox1的内容
private void 清除text1ToolStripMenuItem_Click(object sender, EventArgs e)
{
textBox1.Text = "";
} //清空textbox2的内容
private void 清除text2ToolStripMenuItem_Click(object sender, EventArgs e)
{
textBox2.Text = "";
} private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
{
StreamWriter mySteam;
SaveFileDialog Sfdlg = new SaveFileDialog();
saveFileDialog1.Filter= " Word文档97-2003(*.doc)|*.doc|txt files(*.txt)|*.txt|Excel工作簿97-2003(*.xls)|*.xls|All files(*.*)|*.*";
saveFileDialog1.FilterIndex = ; //设置默认文件类型
saveFileDialog1.FileName = "default1"; //设置文件的默认名称
saveFileDialog1.RestoreDirectory = true; //记忆上次打开位置
if (saveFileDialog1.ShowDialog()== DialogResult.OK)
{
mySteam = new StreamWriter(saveFileDialog1.FileName);
mySteam.Write(textBox2.Text.Trim());
//使用Flush()方法将所有信息从基础缓冲区移动到其目标或清除缓冲区,或者同时执行这两种操作
mySteam.Flush();
mySteam.Close();
}
}
}
}

三.涉及的知识点

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#利用substring按指定长度分割字符串的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. MySQL的字符编码设置

    -- 创建数据库时,设置数据库的编码方式 -- CHARACTER SET:指定数据库采用的字符集,utf8不能写成utf-8-- COLLATE:指定数据库字符集的排序规则,utf8的默认排序规则为 ...

  2. 使用VNC+SSH建立安全的远程桌面访问WINDOWS服务器

    用了一段时间的MONO,现在MONO也支持了ENTITY FRAMEWORK 6.但是实际上在LINUX环境里用MYSQL还是会有很多坑.并且之前在网络游戏服务端SCUT上扩展一些功能时候也遇到了一些 ...

  3. 洛谷 P2073 送花【Treap】题解+AC代码

    题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花束,他不断地向里面 ...

  4. Java基础(含思维导图)

    很早之前整理的Java基础的一些知识点,思维导图: 1.'别名现象' 对一个对象赋值另一个对象,会指向新的对象引用,赋值前的对象引用会由于不再被引用而被gc回收: 而基本类型则不同.基本类型存储了实际 ...

  5. selenium自动化测试配置工具整理

    firefox浏览器历史版本 网址通道:http://ftp.mozilla.org/pub/firefox/releases/ chromedriver历史版本 网址通道:http://chrome ...

  6. Java JMS 程序基础 与 ActiveMQ 安装(一)

    一 ActiveMQ安装 从Apache官网上下载 ActivieMQ的安装包 apache-activemq-5.9.1-bin.tar.gz, 并拷贝到linux的安装目录解压 # tar -zx ...

  7. mongodb 配置均衡器的运行窗口

    当系统的数据量增长不是太快的时候,考虑到数据迁移会降低系统性能,可以配置均衡器在只在特定时间段运行.详细的配置步骤如下: 连接到任意的mongos服务器,并通过安全认证(如果有认证的话). 切换到co ...

  8. hexo持续更新记录

    port:50187

  9. Java常见加密算法

    常见 package com.example.decript; import java.io.UnsupportedEncodingException; import java.security.In ...

  10. 网络基础tcp/ip协议五

    传输层的作用: ip层提供点到点的链接. 传输层提供端到端的链接. 传输层的协议: TCP: 传输控制协议可靠的,面向链接的协议,传输效率低. UDP: 用户数据报协议,不可靠,无连接的服务,传输效率 ...