📄 i8583.cs
字号:
using System;
using System.Collections;
using System.Net.Sockets;
using System.Net;
namespace My8583App
{
struct D8583
{
public string flag; // 标志位 0 -- 没填 1-- 填写
public string data; // 数据
public int len; //数据域长度
public int len_act; //实际长度
public int len_var; //变长长度位数指示 0:否 2:2位变长, 3:3位变长
};
/// <summary>
///
/// </summary>
public class My8583
{
D8583[] tab = new D8583[128];
public My8583()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public void InitTab()
{
int i;
for (i = 0; i < 128; i++)
{
settabx(i, "0", "", 0, 0, 0);
}
//settabx_flag(0, "1");
settabx_len(0, 8);
settabx_len(1, 21, 2);
settabx_len(2, 6);
settabx_len(3, 12);
settabx_len(4, 12);
settabx_len(5, 12);
settabx_len(7, 10);
settabx_len(8, 10);
settabx_len(9, 10);
settabx_len(10, 6);
settabx_len(11, 6);
settabx_len(12, 4);
settabx_len(13, 4);
settabx_len(14, 4);
settabx_len(15, 4);
settabx_len(16, 4);
settabx_len(17, 4);
settabx_len(18, 3);
settabx_len(19, 3);
settabx_len(20, 3);
settabx_len(21, 3);
settabx_len(22, 3);
settabx_len(23, 3);
settabx_len(24, 2);
settabx_len(25, 2);
settabx_len(26, 1);
settabx_len(27, 9);
settabx_len(28, 9);
settabx_len(29, 9);
settabx_len(30, 9);
settabx_len(31, 11, 2);
settabx_len(32, 11, 2);
settabx_len(33, 28, 2);
settabx_len(34, 37, 2);
settabx_len(35, 104, 3);
settabx_len(36, 12);
settabx_len(37, 6);
settabx_len(38, 2);
settabx_len(39, 3);
settabx_len(40, 8);
settabx_len(41, 15);
settabx_len(42, 40);
settabx_len(43, 25);
settabx_len(44, 76);
settabx_len(45, 999, 3);
settabx_len(46, 999, 3);
settabx_len(47, 322, 3);
settabx_len(48, 3);
settabx_len(49, 3);
settabx_len(50, 3);
settabx_len(51, 16);
settabx_len(52, 16);
settabx_len(53, 40, 3);
settabx_len(54, 510, 3);
settabx_len(55, 999, 3);
settabx_len(56, 999, 3);
settabx_len(57, 100, 3);
settabx_len(58, 999, 3);
settabx_len(59, 13, 3);
settabx_len(60, 29, 3);
settabx_len(61, 8);
settabx_len(62, 24, 2);
settabx_len(71, 4);
settabx_len(89, 40);
settabx_len(92, 3);
settabx_len(95, 26, 2);
settabx_len(101, 30, 2);
settabx_len(102, 30, 2);
settabx_len(119, 999, 3);
settabx_len(120, 999, 3);
settabx_len(121, 999, 3);
settabx_len(122, 999, 3);
settabx_len(127, 8);
}
public void settabx_flag(int i, string flag)
{
tab[i].flag = flag;
}
public string Gettabx_flag(int i)
{
return tab[i].flag;
}
public void settabx_data(int i, string data)
{
// if(data.Length>0)
// {
tab[i].flag = "1";
tab[i].data = data;
// }
// else
// {
// tab[i].flag="0";
// tab[i].data="";
// }
}
public string gettabx_data(int i)
{
return tab[i].data;
}
public void settabx_len(int i, int len)
{
tab[i].len = len;
}
public void settabx_len(int i, int len, int var)
{
tab[i].len = len;
tab[i].len_var = var;
}
public void settabx_len_act(int i, int len_act)
{
tab[i].len_act = len_act;
}
public void settabx_len_var(int i, int len_var)
{
tab[i].len_var = len_var;
}
public void settabx(int i, string flag, string data)
{
tab[i].flag = flag;
tab[i].data = data;
}
public void settabx(int i, string flag, string data, int len, int len_act, int len_var)
{
tab[i].flag = flag;
tab[i].data = data;
tab[i].len = len;
tab[i].len_act = len_act;
tab[i].len_var = len_var;
}
/// <summary>
/// 发送BitMap转换
/// </summary>
/// <param name="value">需要转换的数据</param>
/// <param name="fromBase">原进制</param>
/// <param name="toBase">转换后进制</param>
/// <returns></returns>
private string SendConvertString(string value, int fromBase, int toBase)
{
int intValue = Convert.ToInt32(value, fromBase);
return Convert.ToString(intValue, toBase);
}
/// <summary>
/// 组包
/// </summary>
/// <param name="msgType">消息类型char[4]</param>
/// <returns></returns>
public byte[] Pack8583(string msgType)
{
byte[] BitMap = new byte[16];
string[] ls_BitMap = new string[] { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" };
for (int i = 0; i < 128; i++)
{
ls_BitMap[i / 8] += tab[i].flag;
}
for (int i = 0; i < 16; i++)
{
BitMap[i] = (byte)System.Convert.ToInt16(SendConvertString(ls_BitMap[i], 2, 10));
}
//报文头
string s_head = "00000" + "01" + tab[10].data + "0000";
byte[] tpdu = new byte[]{0x60,0x00,0x30,0x00,0x00};
byte[] pkg_head=new byte[]{0x62,0x00,0x00,0x00,0x00,0x00};
/**注意这里0X00在字符串中为结束符,所以s_head的实际值为"."**/
//扫描变长字段,付值时只需给数据付值,不须付长度
for (int i = 0; i < 128; i++)
{
if (tab[i].len_var > 0 && tab[i].flag == "1")
{
tab[i].data = ((System.Text.Encoding.Default.GetBytes(tab[i].data)).Length.ToString()).PadLeft(tab[i].len_var, '0') + tab[i].data;
}
}
//检查字段合法性,如果字段长度不符合定义则返回字段序号
for (int i = 0; i < 128; i++)
{
if (tab[i].flag == "1")
{
if ((System.Text.Encoding.Default.GetBytes(tab[i].data)).Length > tab[i].len || ((System.Text.Encoding.Default.GetBytes(tab[i].data)).Length != tab[i].len && tab[i].len_var == 0))
{
byte[] t_byte = new byte[2];
//t_byte[0] = (byte)i;
t_byte[0] = (byte)tab[i].len;
t_byte[1] = (byte)System.Text.Encoding.Default.GetBytes(tab[i].data).Length;
return t_byte;
}
}
}
//byte[] testbt = new byte[] { 0x31, 0x32, 0x33, 0x34 };
//return testbt;
//报文实际长度
int length = tpdu.Length+pkg_head.Length + msgType.Length + BitMap.Length;
for (int i = 0; i < 128; i++)
{
length += (System.Text.Encoding.Default.GetBytes(tab[i].data)).Length;
}
//长度位
byte[] cd = new byte[2];
cd[0] = (byte)((length / 256) % 256);
cd[1] = (byte)(length % 256);
//组报文
ArrayList msgArr = new ArrayList();
msgArr.Add(cd);
msgArr.Add(tpdu);
msgArr.Add(pkg_head);
msgArr.Add(System.Text.Encoding.Default.GetBytes(msgType));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -