您的位置:首页 > 编程语言 > C#

C#对二进制数据进行拼接平移补位,并用BinaryWriter写入文件中

2016-08-18 15:18 381 查看
这几天的工作是将从硬件中读出的数据“清洗”以后输出到文件中。硬件中的数据都是以0101这种形式储存的,而每两个byte是一组,在这16位的二进制数据中,前11位为数据,后5位为校验位。所谓的“清洗”就是将这两个Byte中的校验位去掉,恢复为11位bit并写入文件中。

因为BinaryWriter是按照字节写入,所以最终笔者也将数字一个Byte一个Byte的写入了。关于二进制的数据的直接操作笔者没有找到,所以将其转换为string即字符串类型,这样补位之类的操作就简单了很多。平移是在数据层面完成的,而补位等是在字符串层面完成的。以下为完整代码,已经跑通,希望能给同为初学者的大家一点帮助。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.IO;

namespace ConsoleApplication2
{
class Program
{
public static String DataStr = "";

public static void CreatFile()
{

if (File.Exists("mydata.bin"))  //判断文件是否已经存在
{
//fs =new FileStream ("mydata.bin", FileMode.Open);
File.Delete("mydata.bin");  //存在则删除原文件
var myfile=File.Create("mydata.bin");//创建新文件
myfile.Close();
}
else
{

var myfile = File.Create("mydata.bin");//否则直接创建文件
myfile.Close();

}

}

public static string DataConvToStr(byte[] array, int length)
{
ushort unit = 0;     //采用16位的数据类型来拼接两个Byte
string OutPutStr = "";
for (int a = 0; a < length; a = a + 2)
{
unit = 0;
unit = (ushort)(unit ^ array[a]);  //将array[a]赋给unit的低8位
unit = (ushort)(unit << 8);  //unit的低8位移动到高8位
unit = (ushort)(unit ^ array[a + 1]); //在array[a+1]赋给unit的低8位
//Console.Out.WriteLine(Convert.ToString(unit, 2)); //以二进制输出unit
unit = (ushort)(unit >> 5);
OutPutStr += System.Convert.ToString(unit, 2).PadLeft(11, '0');  //在转换成字符串时会自动将前面的0去掉,这样会在数据拼接时产生错误
//但是须知数据应该为11位,所以将左边高位补零

//OutPutStr1 += System.Convert.ToString(unit, 2).PadLeft(16, '0');
}
return OutPutStr;

}
public static bool StrToByte()
{
int ByteLen = DataStr.Length % 8 == 0 ? DataStr.Length / 8 : (DataStr.Length / 8) + 1;   //判断得到的数据需要写入的Byte数
int i = 0;
byte DataByte = 0;

DataStr = DataStr.PadRight(ByteLen * 8, '0');   //因为得到的二进制数字符串不一定是Byte的整数倍,将其后面补0
for (i = 0; i < ByteLen * 8; i = i + 8)
{
string SubString = DataStr.Substring(i, 8);    //每8位字符串截取出来作为一个Byte的值
DataByte = Convert.ToByte(SubString, 2);       //将字符串转换成相应的Byte值
FileStream fs = new FileStream("mydata.bin", FileMode.Append);
BinaryWriter bw = new BinaryWriter(fs);
try
{
bw.Write(DataByte);//将字符串写入文件

}
catch (IOException e)
{
// Console.WriteLine(e.Message + "Cannot write to file.");
return false;

}
bw.Close();            //及时关闭句柄,否则多次调用时会报错"文件已被占用"
fs.Close();
}

return true;

}

static void Main(string[] args)
{
byte[] array = { 0xFF, 0x00, 0xFF ,0x00,0xFF,0x00};

CreatFile();

DataStr = DataConvToStr(array, array.Length);

if (StrToByte())
{
Console.WriteLine("Success!");

}
else
{
Console.WriteLine("error!");
}

Console.ReadLine();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息