xbytearray.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include "xbytearray.h"
  2. XByteArray::XByteArray()
  3. {
  4. _oldSize = -99;
  5. _addressNumbers = 4;
  6. _addressOffset = 0;
  7. }
  8. int XByteArray::addressOffset()
  9. {
  10. return _addressOffset;
  11. }
  12. void XByteArray::setAddressOffset(int offset)
  13. {
  14. _addressOffset = offset;
  15. }
  16. int XByteArray::addressWidth()
  17. {
  18. return _addressNumbers;
  19. }
  20. void XByteArray::setAddressWidth(int width)
  21. {
  22. if ((width >= 0) && (width<=6))
  23. {
  24. _addressNumbers = width;
  25. }
  26. }
  27. QByteArray & XByteArray::data()
  28. {
  29. return _data;
  30. }
  31. void XByteArray::setData(QByteArray data)
  32. {
  33. _data = data;
  34. _changedData = QByteArray(data.length(), char(0));
  35. }
  36. bool XByteArray::dataChanged(int i)
  37. {
  38. return bool(_changedData[i]);
  39. }
  40. QByteArray XByteArray::dataChanged(int i, int len)
  41. {
  42. return _changedData.mid(i, len);
  43. }
  44. void XByteArray::setDataChanged(int i, bool state)
  45. {
  46. _changedData[i] = char(state);
  47. }
  48. void XByteArray::setDataChanged(int i, const QByteArray & state)
  49. {
  50. int length = state.length();
  51. int len;
  52. if ((i + length) > _changedData.length())
  53. len = _changedData.length() - i;
  54. else
  55. len = length;
  56. _changedData.replace(i, len, state);
  57. }
  58. int XByteArray::realAddressNumbers()
  59. {
  60. if (_oldSize != _data.size())
  61. {
  62. // is addressNumbers wide enought?
  63. QString test = QString("%1")
  64. .arg(_data.size() + _addressOffset, _addressNumbers, 16, QChar('0'));
  65. _realAddressNumbers = test.size();
  66. }
  67. return _realAddressNumbers;
  68. }
  69. int XByteArray::size()
  70. {
  71. return _data.size();
  72. }
  73. QByteArray & XByteArray::insert(int i, char ch)
  74. {
  75. _data.insert(i, ch);
  76. _changedData.insert(i, char(1));
  77. return _data;
  78. }
  79. QByteArray & XByteArray::insert(int i, const QByteArray & ba)
  80. {
  81. _data.insert(i, ba);
  82. _changedData.insert(i, QByteArray(ba.length(), char(1)));
  83. return _data;
  84. }
  85. QByteArray & XByteArray::remove(int i, int len)
  86. {
  87. _data.remove(i, len);
  88. _changedData.remove(i, len);
  89. return _data;
  90. }
  91. QByteArray & XByteArray::replace(int index, char ch)
  92. {
  93. _data[index] = ch;
  94. _changedData[index] = char(1);
  95. return _data;
  96. }
  97. QByteArray & XByteArray::replace(int index, const QByteArray & ba)
  98. {
  99. int len = ba.length();
  100. return replace(index, len, ba);
  101. }
  102. QByteArray & XByteArray::replace(int index, int length, const QByteArray & ba)
  103. {
  104. int len;
  105. if ((index + length) > _data.length())
  106. len = _data.length() - index;
  107. else
  108. len = length;
  109. _data.replace(index, len, ba.mid(0, len));
  110. _changedData.replace(index, len, QByteArray(len, char(1)));
  111. return _data;
  112. }
  113. QChar XByteArray::asciiChar(int index)
  114. {
  115. char ch = _data[index];
  116. if ((ch < 0x20) || (ch > 0x7e))
  117. ch = '.';
  118. return QChar(ch);
  119. }
  120. QString XByteArray::toRedableString(int start, int end)
  121. {
  122. int adrWidth = realAddressNumbers();
  123. if (_addressNumbers > adrWidth)
  124. adrWidth = _addressNumbers;
  125. if (end < 0)
  126. end = _data.size();
  127. QString result;
  128. for (int i=start; i < end; i += 16)
  129. {
  130. QString adrStr = QString("%1").arg(_addressOffset + i, adrWidth, 16, QChar('0'));
  131. QString hexStr;
  132. QString ascStr;
  133. for (int j=0; j<16; j++)
  134. {
  135. if ((i + j) < _data.size())
  136. {
  137. hexStr.append(" ").append(_data.mid(i+j, 1).toHex());
  138. ascStr.append(asciiChar(i+j));
  139. }
  140. }
  141. result += adrStr + " " + QString("%1").arg(hexStr, -48) + " " + QString("%1").arg(ascStr, -17) + "\n";
  142. }
  143. return result;
  144. }