示例#1
0
        /// <summary>
        /// Запись данные по указанному адресу
        /// </summary>
        public void WriteBuffer(UInt32 addr, Byte[] data)
        {
            // Поиск расположения данных в 64к регионах
            IntelHexRegion region = SearchRegion(addr);

            // Регион не существует для текущего адреса
            if (region == null)
            {
                // Создание региона
                region = CreateRegion(addr);
            }

            int totalSize = data.Length;
            int writeSize = region.Write(addr, data);

            if (writeSize != 0 && writeSize < totalSize)
            {
                // Буфер записан не весь: Часть переноситься на другой регион
                data  = Mem.Clone(data, writeSize, totalSize - writeSize);
                addr += (UInt32)writeSize;

                // Запись следующего региона
                WriteBuffer(addr, data);
            }
        }
示例#2
0
        protected void RaiseOnReceive(Socket winsock, Byte[] buffer, int size)
        {
            if (OnRead != null)
            {
                Byte[] realBuffer = Mem.Clone(buffer, 0, size);

                OnRead(winsock, realBuffer);
            }
        }
示例#3
0
        private String GenerateText(Byte[] data)
        {
            if (data != null)
            {
                int    bytesInLine = BytesInLine;
                int    processSize = 0;
                int    totalSize   = data.Length;
                String result      = "";

                // Добавление шапки
                //if (BytesInLine == 16)
                //{
                //    result += "  Address  |  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 |                 " + "\r\n";
                //    result += "-------------------------------------------------------------|-----------------" + "\r\n";
                //}
                //else
                //{
                //    result += "  Address  |  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |                 " + "\r\n";
                //    result += "-------------------------------------------------------------------------------------------------------------|-----------------" + "\r\n";
                //}
                // result += "0x00AA00AA | 00 00 00 00 00 00 00 00 00 00 00 AA BB CC DD EE | 0123456789ABCDEF";

                while (processSize < totalSize)
                {
                    int size = totalSize - processSize;
                    if (size > bytesInLine)
                    {
                        size = bytesInLine;
                    }

                    Byte[] buffer = Mem.Clone(data, processSize, size);

                    String addr  = Conv.IntToHex((UInt32)(Address + processSize));
                    String hex   = buffer.ToAsciiEx(" ");
                    String ascii = Conv.BufferToString(buffer, ".");

                    if (size < bytesInLine)
                    {
                        // Дополнение пробелами до полной строки
                        int remain = bytesInLine - size;
                        ascii = ascii.PadRight(bytesInLine, ' ');
                        hex   = hex.PadRight(bytesInLine * 3 - 1, ' ');
                    }

                    String text = String.Format("{0} | {1} | {2}", addr, hex, ascii) + "\r\n";

                    result      += text;
                    processSize += size;
                }

                return(result);
            }

            return(null);
        }
示例#4
0
        /// <summary>
        /// Преобразование региона в текстовое представление
        /// </summary>
        /// <returns></returns>
        public String ToText(int width)
        {
            String result = "";

            // Формирование записи "Регион" (для 0-го адреса описание региона не добавляется)
            if (AddrStart != 0)
            {
                IntelHexRecord recordSegment = IntelHexRecord.SegmentRecord(AddrStart);
                result = recordSegment.Text + "\r\n";
            }

            Byte[]  buffer = new Byte[width];
            int     count  = 0;
            int     addr   = -1;
            Boolean flag   = false;

            for (int i = 0; i < REGION_SIZE; i++)
            {
                if (_present[i] != 0)
                {
                    // Сохранение адреса начала блока
                    if (addr == -1)
                    {
                        addr = i;
                    }
                    // Сохранение байта в буфер
                    buffer[count++] = _buffer[i];

                    if (count >= width || (i == (REGION_SIZE - 1)))
                    {
                        // Набрана строка: Формирование записи
                        flag = true;
                    }
                } // end if (байт присутствует)
                else
                {
                    // Нет данных
                    if (addr != -1)
                    {
                        // Если предыдущие данные были -> Формирование записи
                        flag = true;
                    }
                }

                if (flag)
                {
                    // Набрана строка: Формирование записи
                    flag = false;
                    // Выделение данных из буфера (если количество меньше)
                    Byte[] data = Mem.Clone(buffer, 0, count);
                    // Формирование записи
                    IntelHexRecord recordData = IntelHexRecord.DataRecord((UInt16)addr, data);

                    // Добавление текстового представления к результату
                    result += recordData.Text + "\r\n";

                    // Сброс адреса и счетчика байт
                    addr  = -1;
                    count = 0;
                }
            } // end for (перебор всех байт в регионе)

            return(result);
        }