Beispiel #1
0
        // 根据当前的所有元素,设置 Content parameter 元素内容
        // parameters:
        //      trim_right  是否要截掉右侧多余的连续 0?截掉是一般做法。而不截掉,也就是保留足够 byte 数,足以应对以后元素增多以后的局面,保证 content parameter 本身耗用的空间和以前一致,有利于芯片以后修改内容时的布局。
        public void SetContentParameter(bool trim_right)
        {
            var content_parameter = this.FindElement(ElementOID.ContentParameter);
            if (content_parameter == null)
                content_parameter = this.NewElement(ElementOID.ContentParameter, null);

            UInt64 value = 0;
            foreach (Element element in this._elements)
            {
                int oid = (int)element.OID;
                if (oid >= 3)
                {
                    // TODO: 测试 0x80000000 >> 0 会不会有问题
                    value |= 0x8000000000000000 >> (oid - 3);
                }
            }

            if (value == 0)
            {
                this.RemoveElement(ElementOID.ContentParameter);
                return;
            }

            var bytes = Compact.ReverseBytes(BitConverter.GetBytes(value));
            if (trim_right)
                bytes = Compact.TrimRight(bytes);
            content_parameter.Content = bytes;
            content_parameter.Text = Element.GetHexString(content_parameter.Content);
        }
Beispiel #2
0
        // 编码范围在 'A'-'9' 内的三个字符为两个 bytes
        public static byte[] EncodeTriple(int c1, int c2, int c3)
        {
            List <byte> results = new List <byte>();
            uint        v       = (1600 * (uint)c1) + (40 * (uint)c2) + (uint)c3 + 1;

            if (v > UInt16.MaxValue)
            {
                throw new Exception($"{v} 溢出 16 bit 整数范围");
            }
            return(Compact.ReverseBytes(BitConverter.GetBytes((UInt16)v)));
        }