代码如下:
/// <summary>
/// 添加自定义数据
/// </summary>
/// <param name="file_path">文件路径,此文件为二进制dat文件</param>
/// <returns></returns>
private string AddSignal(string file_path)
{
var result = ""; // 执行结果
// 如果文件不存在则创建
if (!File.Exists(file_path))
{
using (FileStream file = new FileStream(file_path, FileMode.Create))
{
}
}
// 数据结构说明
// 数据号(4)+类型(4)+数据(48)+校验位(4)
// 类型:外部 00 00 00 00 序列 01 00 00 00
// 数据:48位,每一个十进制数占两位,每个十进制数独立分割存储
// 校验位:校验算法不清楚,已测试过Modbus校验、LRC校验、和校验、异或校验,皆不是。
// 读取历史文件数据
var history_data = "";
FileStream fs = new FileStream(file_path, FileMode.Open);
byte[] array = new byte[fs.Length];
fs.Read(array, 0, array.Length);
fs.Close();
for (int i = 0; i < array.Length; i++)
{
history_data = history_data + string.Format("{0:X2}", array[i]);
}
var hex_data = ""; // 需要写入的十六进制数据
// 过滤已存在的数据
int[] IDs = { 901, 9881, 9882, 9883, 9884, 9885, 9886, 9995, 9996, 9997, 9701, 9603 };
for (int i = 0; i < IDs.Length; i++)
{
var id = IDs[i];
// 十进制转十六进制存储&小端形式
var hex_id = "";
byte[] byteId = BitConverter.GetBytes(id);
if (BitConverter.IsLittleEndian)
{
// 如果是小端字节序,则不需要调整
}
else
{
// 如果是大端字节序,则反转字节数组以得到小端字节序
Array.Reverse(byteId);
}
hex_id = BitConverter.ToString(byteId).Replace("-", "");
// 封装数据
var column_data = "";
#region
if (id == 901)
{
column_data = "8503000000000000C8FDD4C2C4DABDE2BDFBB9C9000000000000000000000000000000000000000000000000000000000000000000000000F0D2F50D";
}
if (id == 9881)
{
column_data = "9926000000000000C1ACB0E2CCECCAFD00000000000000000000000000000000000000000000000000000000000000000000000000000000D011F80D";
}
if (id == 9882)
{
column_data = "9A26000000000000CAD7B7E2CAB1BCE400000000000000000000000000000000000000000000000000000000000000000000000000000000E8D1F50D";
}
if (id == 9883)
{
column_data = "9B26000000000000C4A9B7E2CAB1BCE4000000000000000000000000000000000000000000000000000000000000000000000000000000009012F80D";
}
if (id == 9884)
{
column_data = "9C26000000000000B8F6B9C9D0C2CEC500000000000000000000000000000000000000000000000000000000000000000000000000000000D87EFF0D";
}
if (id == 9885)
{
column_data = "9D26000000000000B0E5BFE9CCE2B2C400000000000000000000000000000000000000000000000000000000000000000000000000000000E8D1F50D";
}
if (id == 9886)
{
column_data = "9E26000000000000CDACBBA8CBB3B8C5C4EE00000000000000000000000000000000000000000000000000000000000000000000000000001812F80D";
}
if (id == 9995)
{
column_data = "0B27000000000000CCD8CAE2CCE1CABE000000000000000000000000000000000000000000000000000000000000000000000000000000009012F80D";
}
if (id == 9996)
{
column_data = "0C27000000000000D6F7D3AAD2B5CEF100000000000000000000000000000000000000000000000000000000000000000000000000000000D87EFF0D";
}
if (id == 9997)
{
column_data = "0D27000000000000D5C7CDA3D4ADD2F200000000000000000000000000000000000000000000000000000000000000000000000000000000687FFF0D";
}
if (id == 9701)
{
column_data = "E525000000000000D3CED7CAD0ADD7F7CFAFCEBB3937303100000000000000000000000000000000000000000000000000000000000000005013F80D";
}
if (id == 9603)
{
column_data = "8325000000000000BEBABCDBB1CACAFD000000000000000000000000000000000000000000000000000000000000000000000000000000003813F80D";
}
#endregion
// 只有不存在的数据号才需要加入
if (!history_data.Contains(hex_id))
{
hex_data += column_data;
}
}
// 添加数据至二进制文件dat
try
{
if (!string.IsNullOrEmpty(hex_data))
{
// 写入数据
hex_data = hex_data.Replace(",", "");
hex_data = hex_data.Replace("\n", "");
hex_data = hex_data.Replace("\\", "");
hex_data = hex_data.Replace(" ", "");
if (hex_data.Length % 2 != 0)
{
hex_data += "20";//空格
}
byte[] bytes_data = new byte[hex_data.Length / 2];
for (int j = 0; j < bytes_data.Length; j++)
{
try
{
bytes_data[j] = byte.Parse(hex_data.Substring(j * 2, 2),
System.Globalization.NumberStyles.HexNumber);
}
catch (Exception ex)
{
result = ex.Message;
}
}
if (string.IsNullOrEmpty(history_data))
{
// 如果历史数据为空,则创建
BinaryWriter bw = new BinaryWriter(new FileStream(file_path, FileMode.Create));
bw.Write(bytes_data);
bw.Close();
result = "自定义数据写入成功";
}
else
{
// 如果历史数据存在,则追加
BinaryWriter bw = new BinaryWriter(new FileStream(file_path, FileMode.Append));
bw.Write(bytes_data);
bw.Close();
result = "自定义数据追加成功";
}
}
else
{
result = "数据重复,无需更新";
}
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}
/// <summary>
/// 添加自定义板块
/// </summary>
/// <param name="file_path">文件路径,此文件为二进制dat文件</param>
/// <returns></returns>
private string AddBlock(string file_path)
{
var result = ""; // 执行结果
// 如果文件不存在则创建
if (!File.Exists(file_path))
{
using (FileStream file = new FileStream(file_path, FileMode.Create))
{
}
}
// 数据结构说明
// 数据号(4)+类型(4)+数据(48)+校验位(4)
// 类型:外部 00 00 00 00 序列 01 00 00 00
// 数据:48位,每一个十进制数占两位,每个十进制数独立分割存储
// 校验位:校验算法不清楚,已测试过Modbus校验、LRC校验、和校验、异或校验,皆不是。
// 读取历史文件数据
var history_data = "";
FileStream fs = new FileStream(file_path, FileMode.Open);
byte[] array = new byte[fs.Length];
fs.Read(array, 0, array.Length);
fs.Close();
for (int i = 0; i < array.Length; i++)
{
history_data = history_data + string.Format("{0:X2}", array[i]);
}
var hex_data = ""; // 需要写入的十六进制数据
// 人气榜
var top_data = "C8CBC6F8B0F1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052514200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
// 竞价笔数
var bid_data = "BEBABCDBB1CACAFD0000000000000000000000000000000000000000000000000000000000000000000000000000000000004A4A4253000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
// 只有不存在才需要加入
if (!history_data.Contains("C8CBC6F8B0F100"))
{
hex_data += top_data;
}
if (!history_data.Contains("BEBABCDBB1CACAFD00"))
{
hex_data += bid_data;
}
// 添加数据至二进制文件dat
try
{
if (!string.IsNullOrEmpty(hex_data))
{
// 写入数据
hex_data = hex_data.Replace(",", "");
hex_data = hex_data.Replace("\n", "");
hex_data = hex_data.Replace("\\", "");
hex_data = hex_data.Replace(" ", "");
if (hex_data.Length % 2 != 0)
{
hex_data += "20";//空格
}
byte[] bytes_data = new byte[hex_data.Length / 2];
for (int j = 0; j < bytes_data.Length; j++)
{
try
{
bytes_data[j] = byte.Parse(hex_data.Substring(j * 2, 2),
System.Globalization.NumberStyles.HexNumber);
}
catch (Exception ex)
{
result = ex.Message;
}
}
if (string.IsNullOrEmpty(history_data))
{
// 如果历史数据为空,则创建
BinaryWriter bw = new BinaryWriter(new FileStream(file_path, FileMode.Create));
bw.Write(bytes_data);
bw.Close();
result = "板块写入成功";
}
else
{
// 如果历史数据存在,则追加
BinaryWriter bw = new BinaryWriter(new FileStream(file_path, FileMode.Append));
bw.Write(bytes_data);
bw.Close();
result = "板块追加写入成功";
}
}
else
{
result = "数据重复,无需更新";
}
}
catch (Exception ex)
{
result = ex.Message;
}
return result;
}
运行效果:
DEMO软件下载: