Обрабатывать оставшиеся байты при копировании в кратных 8x байтах?
Привет.
Я надеюсь, что кто-нибудь может указать мне правильное направление, пожалуйста.
Я новичок в C# и пишу простое приложение, которое использует сетку данных для отображения диапазона байтов, считанных из файла или смарт-карты.
Каждая строка в моей таблице данных имеет адрес смещения, а затем 8-кратные байтовые записи с метками 00, 01, 02 и т. д.
Мой пользовательский класс принимает байтовый ввод[] и циклически проходит через него, беря 8x байтов за раз и создавая "список" байтовых блоков моего пользовательского класса (это просто класс, который представляет блок из восьми байтов и смещения, так что я могу циклически проходить и добавлять их в сетку данных.
Теперь он работает нормально, при условии, что у меня есть структура byte[] кратная 8, однако, скажем, у меня есть byte[18] - теперь у меня есть 2x байтовые часы по 8 байт плюс 2x оставшихся байта.
Я пытаюсь понять, как создать третий блок данных с оставшимися более чем 2 байтами и заполнить оставшиеся 6 байтов 0x00, и вот здесь я застрял.
Я пробовал гуглить, но не уверен, что ищу, так что трудно найти решение.
Я постараюсь показать разделы кода, которые, по моему мнению, имеют отношение к делу, и я был бы очень благодарен, если бы кто-нибудь мог помочь, но, пожалуйста, примите во внимание, что я учусь и знаю, что мой код, скорее всего, будет грязным :)
<pre>private void BuildDataArray() { // TODO Need to re-write so that we can also create rows for odd number of byte left over, and set the rmaining bytes in that block to 0x00 int dataSize = data.Length; // How many Bytes are in our full data block uint calcOffset = 0x00; int count = dataSize / 8; // Get a count of each 8 byte block int bytesToTake = 8; int bytesToSkip = 0; for (int i = 0; i < count; i++) { byte[] tempData = data.Skip(bytesToSkip).Take(bytesToTake).ToArray(); bytesToSkip = bytesToSkip + 8; bytesToTake = bytesToTake + 8; ByteBlock tempByteBlock = new ByteBlock(tempData, calcOffset); calcOffset = calcOffset + 8; _byteBlock.Add(tempByteBlock); // Add each 8 byte block to the main ByteBlockArray } }
Это мой класс ByteBlockArray, который содержит массив байтовых часов, которые, в свою очередь, содержат 8 байтовых блоков данных со смещением...
<pre>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DataTest { class ByteBlockArray { private List<ByteBlock> _byteBlock = new List<ByteBlock>(); // Array/List of ByteBlock objects each to hold an 8 byte "recoord" for the datagrid private byte[] data; // This is the full data block that will be used to create 8xbyte blocks private byte offset; // This will hold the initial offset for the full data block public ByteBlockArray(byte[] data, byte offset) { this.data = data; this.offset = offset; BuildDataArray(); } private void BuildDataArray() { // TODO Need to re-write so that we can also create rows for odd number of byte left over, and set the rmaining bytes in that block to 0x00 int dataSize = data.Length; // How many Bytes are in our full data block uint calcOffset = 0x00; int count = dataSize / 8; // Get a count of each 8 byte block int bytesToTake = 8; int bytesToSkip = 0; for (int i = 0; i < count; i++) { byte[] tempData = data.Skip(bytesToSkip).Take(bytesToTake).ToArray(); bytesToSkip = bytesToSkip + 8; bytesToTake = bytesToTake + 8; ByteBlock tempByteBlock = new ByteBlock(tempData, calcOffset); calcOffset = calcOffset + 8; _byteBlock.Add(tempByteBlock); // Add each 8 byte block to the main ByteBlockArray } } public ByteBlock GetByteBlockIndex(int index) { return _byteBlock[index]; } public int GetByteBlockCount() { return this._byteBlock.Count; } } }
Это класс байтовых блоков, как описано выше, и это "список" элементов, отображаемых в моей таблице данных...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DataTest { class ByteBlock { private byte _00 = 0x00; private byte _01 = 0x00; private byte _02 = 0x00; private byte _03 = 0x00; private byte _04 = 0x00; private byte _05 = 0x00; private byte _06 = 0x00; private byte _07 = 0x00; private byte[] tempData; private uint calcOffset; public ByteBlock(byte[] tempData, uint calcOffset) { this.tempData = tempData; this.calcOffset = calcOffset; FillBytes(); } public ByteBlock() { } private void FillBytes() { this._00 = tempData[0]; this._01 = tempData[1]; this._02 = tempData[2]; this._03 = tempData[3]; this._04 = tempData[4]; this._05 = tempData[5]; this._06 = tempData[6]; this._07 = tempData[7]; } public uint Offset { get { return calcOffset; } } public byte i00 { get { return _00; } } public byte i01 { get { return _01; } } public byte i02 { get { return _02; } } public byte i03 { get { return _03; } } public byte i04 { get { return _04; } } public byte i05 { get { return _05; } } public byte i06 { get { return _06; } } public byte i07 { get { return _07; } } } }
И это код, который я использую в основной форме для тестирования, передавая в фиктивный массив байтов. Если массив байтов кратен 8 байтам, он работает нормально, если нет, то он не будет работать так, как есть...
<pre>using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace DataTest { public partial class Form1 : DevExpress.XtraEditors.XtraForm { List<ByteBlock> dataStructure = new List<ByteBlock>(); public Form1() { InitializeComponent(); } private void ButtonCreateData_Click(object sender, EventArgs e) { byte[] data = {0xed, 0xc6, 0x43, 0x32, 0x45, 0xd3, 0x3a, 0x43, 0xed, 0xc6, 0x43, 0x32, 0x45, 0xd3, 0x3a, 0x43}; ByteBlockArray byteArray = new ByteBlockArray(data, 0x00); // CAUTION! TEMP area to load data to grid, need to move this to correct place and change as required int count = byteArray.GetByteBlockCount(); ByteBlock bblock = new ByteBlock(); for (int i = 0; i < count; i++) { bblock = byteArray.GetByteBlockIndex(i); // Now add data/rows to grid // outputTokenView.Items.Add(new ListViewItem(new string[] { tkn.GetSerialAsString(), tkn.GetSeedAsString(), tkn.GetKeyAsString(), tkn.GetCreationDate(), tkn.GetExpiryDaysAsString(), tkn.GetStateAsString(), tkn.GetSignatureAsString() })); dataStructure.Add(bblock); } gridControl1.DataSource = dataStructure; } } }
Кроме того, просто чтобы отметить, что я использую элемент управления сеткой данных из подписки DevExpress Winforms.
Еще раз большое вам спасибо за любую помощь...
Что я уже пробовал:
Я узнал все, что было так далеко от моих учебных книг и Google, но не смог узнать, как пройти этот момент, так как даже не уверен, что я ищу.
Спасибо