/// <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); } }
protected void RaiseOnReceive(Socket winsock, Byte[] buffer, int size) { if (OnRead != null) { Byte[] realBuffer = Mem.Clone(buffer, 0, size); OnRead(winsock, realBuffer); } }
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); }
/// <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); }