⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i8583.cs

📁 8583包打包解包小应用
💻 CS
📖 第 1 页 / 共 2 页
字号:
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 + -