struct PacketData
{
char unused[10];
char yead;
char month;
....
};
const char* sourceData = /* исходные данные */;
const PacketData* array = (const PacketData*) sourceData;
cout << "Year 3" << array[2].year;
Алгоритм сортировки данных
Итак, я пишу приложение в которе передается массив данных(пакет).
Структура пакета такова:
1. Первые 10 элементов массива данные, которые меня не интересуют.
2. каждый одинадцатый элемент массива, ключ, в зависимости от данных в нем 0 или 1 сообщает что находится в последующих 10ти элементах.
3. Элементы массива c n*11 +1 до n*11 + 10 содержат полезную информацию. n*11+10 = год, n*11+9 = месяц, n*11+8 = день, n*11+7 = час, n*11+6 минуты
4. Последний элемент массива, контрольная сумма всего пакета.
Что необходимо сделать мне:
1. Произвести просмотр массива и разделить пакеты в зависимости от ключа и сортировать разделенные пакеты по содержимому в элементах даты.
Каждый элемент массива содержит один байт.
PS: если слишком топорно написал, то намекните, что не понятно. Очень надеюсь на вашу помощь ;)
А вообще задача сводится к тому, что бы получить последние по дате данные, которые находятся в элементах массива n*11+1 и n*11+2, при этом, если данные равны нулю (n*11+1 = 0 и n*11+2 = 0), то получить данные за дату ранее.
Может, вам поможет вот такое решение?
Код:
Это конечно очень приблизительно и грубо, но думаю, идея ясна спрашивайте, что не понятно.
И еще, первые данные в массиве, всегда по дате последние, а те которые идут после, более ранние.
т.е. на примере конкретного пакета (может быть разной длины):
Код:
[0] 123 byte
[1] 231 byte
[2] 72 byte
[3] 137 byte
[4] 33 byte
[5] 255 byte
[6] 255 byte
[7] 124 byte
[8] 133 byte
[9] 237 byte
[10] 0 byte
[11] 1 byte //ключ
[12] 12 byte //Нужные данные
[13] 1 byte //Нужные данные
[14] 0 byte // бесполезный элемент :)
[15] 83 byte // бесполезный элемент :)
[16] 3 byte // бесполезный элемент :)
[17] 23 byte //минуты
[18] 7 byte //час
[19] 22 byte //Дата
[20] 2 byte //месяц
[21] 10 byte //год
[22] 0 byte //ключ
[23] 248 byte
[24] 2 byte
[25] 6 byte
[26] 250 byte
[27] 3 byte
[28] 32 byte
[29] 19 byte
[30] 21 byte
[31] 2 byte
[32] 10 byte
[33] 1 byte //ключ
[34] 186 byte
[35] 0 byte
[36] 0 byte
[37] 0 byte
[38] 4 byte
[39] 34 byte
[40] 23 byte
[41] 27 byte
[42] 1 byte
[43] 10 byte
[44] 0 byte //ключ
[45] 53 byte
[46] 2 byte
[47] 6 byte
[48] 250 byte
[49] 3 byte
[50] 16 byte
[51] 18 byte
[52] 27 byte
[53] 1 byte
[54] 10 byte
[55] 1 byte //ключ
[56] 126 byte
[57] 0 byte
[58] 0 byte
[59] 0 byte
[60] 4 byte
[61] 26 byte
[62] 23 byte
[63] 30 byte
[64] 0 byte
[65] 10 byte
[66] 0 byte //ключ
[67] 160 byte
[68] 1 byte
[69] 2 byte
[70] 169 byte
[71] 3 byte
[72] 25 byte
[73] 14 byte
[74] 30 byte
[75] 0 byte
[76] 10 byte
[77] 0 byte //ключ
[78] 176 byte
[79] 0 byte
[80] 4 byte
[81] 83 byte
[82] 4 byte
[83] 39 byte
[84] 17 byte
[85] 30 byte
[86] 11 byte
[87] 9 byte
[88] 1 byte //ключ
[89] 21 byte
[90] 0 byte
[91] 4 byte
[92] 83 byte
[93] 4 byte
[94] 27 byte
[95] 6 byte
[96] 30 byte
[97] 11 byte
[98] 9 byte
[99] 0 byte //ключ
[100] 116 byte
[101] 0 byte
[102] 1 byte
[103] 212 byte
[104] 4 byte
[105] 4 byte
[106] 18 byte
[107] 29 byte
[108] 10 byte
[109] 9 byte
[110] 0 byte //ключ
[111] 15 byte
[112] 0 byte
[113] 2 byte
[114] 169 byte
[115] 4 byte
[116] 4 byte
[117] 13 byte
[118] 27 byte
[119] 9 byte
[120] 9 byte
[121] 1 byte //ключ
[122] 5 byte
[123] 0 byte
[124] 0 byte
[125] 0 byte
[126] 4 byte
[127] 3 byte
[128] 7 byte
[129] 27 byte
[130] 9 byte
[131] 9 byte
[132] 137 byte//Контрольная сумма
[1] 231 byte
[2] 72 byte
[3] 137 byte
[4] 33 byte
[5] 255 byte
[6] 255 byte
[7] 124 byte
[8] 133 byte
[9] 237 byte
[10] 0 byte
[11] 1 byte //ключ
[12] 12 byte //Нужные данные
[13] 1 byte //Нужные данные
[14] 0 byte // бесполезный элемент :)
[15] 83 byte // бесполезный элемент :)
[16] 3 byte // бесполезный элемент :)
[17] 23 byte //минуты
[18] 7 byte //час
[19] 22 byte //Дата
[20] 2 byte //месяц
[21] 10 byte //год
[22] 0 byte //ключ
[23] 248 byte
[24] 2 byte
[25] 6 byte
[26] 250 byte
[27] 3 byte
[28] 32 byte
[29] 19 byte
[30] 21 byte
[31] 2 byte
[32] 10 byte
[33] 1 byte //ключ
[34] 186 byte
[35] 0 byte
[36] 0 byte
[37] 0 byte
[38] 4 byte
[39] 34 byte
[40] 23 byte
[41] 27 byte
[42] 1 byte
[43] 10 byte
[44] 0 byte //ключ
[45] 53 byte
[46] 2 byte
[47] 6 byte
[48] 250 byte
[49] 3 byte
[50] 16 byte
[51] 18 byte
[52] 27 byte
[53] 1 byte
[54] 10 byte
[55] 1 byte //ключ
[56] 126 byte
[57] 0 byte
[58] 0 byte
[59] 0 byte
[60] 4 byte
[61] 26 byte
[62] 23 byte
[63] 30 byte
[64] 0 byte
[65] 10 byte
[66] 0 byte //ключ
[67] 160 byte
[68] 1 byte
[69] 2 byte
[70] 169 byte
[71] 3 byte
[72] 25 byte
[73] 14 byte
[74] 30 byte
[75] 0 byte
[76] 10 byte
[77] 0 byte //ключ
[78] 176 byte
[79] 0 byte
[80] 4 byte
[81] 83 byte
[82] 4 byte
[83] 39 byte
[84] 17 byte
[85] 30 byte
[86] 11 byte
[87] 9 byte
[88] 1 byte //ключ
[89] 21 byte
[90] 0 byte
[91] 4 byte
[92] 83 byte
[93] 4 byte
[94] 27 byte
[95] 6 byte
[96] 30 byte
[97] 11 byte
[98] 9 byte
[99] 0 byte //ключ
[100] 116 byte
[101] 0 byte
[102] 1 byte
[103] 212 byte
[104] 4 byte
[105] 4 byte
[106] 18 byte
[107] 29 byte
[108] 10 byte
[109] 9 byte
[110] 0 byte //ключ
[111] 15 byte
[112] 0 byte
[113] 2 byte
[114] 169 byte
[115] 4 byte
[116] 4 byte
[117] 13 byte
[118] 27 byte
[119] 9 byte
[120] 9 byte
[121] 1 byte //ключ
[122] 5 byte
[123] 0 byte
[124] 0 byte
[125] 0 byte
[126] 4 byte
[127] 3 byte
[128] 7 byte
[129] 27 byte
[130] 9 byte
[131] 9 byte
[132] 137 byte//Контрольная сумма
т.е. смотрим ключ 11 элемента, он равен 1, далее смотрим Нужные данные, и если они не равны 0,0 то оставляем в переменной их, а также дату этого блока, если равны 0,0 то смотрим следующий блок с ключом 1. Тоже самое касается блока с ключом 0.
Может вы меня в конце концов натолкнете на мысль как это реализовать.
PS: Язык программирования использую C#.
Но первому элементу структуры определяем, нужно ли ее обрабатывать, я вас правильно понял?
тогда мождет так:
Код:
struct Header
{
... // 11 bytes
};
struct ProcessableData
{
// 10 bytes
}
struct UnprocesableData
{
// 10 bytes
}
...
Header streamHeader;
myStream.read( streamHeader );
while ( myStream.isEmpty() == false )
{
static char key;
static ProcessableData toProcess;
static UnprocessableData toIgnore;
stream.read( key );
if ( key==NEED_PROCESSING )
{
stream.read( toProcess );
processData( toProcess );
}
else
stream.read( toIgnore );
}
{
... // 11 bytes
};
struct ProcessableData
{
// 10 bytes
}
struct UnprocesableData
{
// 10 bytes
}
...
Header streamHeader;
myStream.read( streamHeader );
while ( myStream.isEmpty() == false )
{
static char key;
static ProcessableData toProcess;
static UnprocessableData toIgnore;
stream.read( key );
if ( key==NEED_PROCESSING )
{
stream.read( toProcess );
processData( toProcess );
}
else
stream.read( toIgnore );
}
В общем я делал таким образом:
Код:
int n, YEAR_D = 0, MONTH_D = 0, DATE_D = 0, HOUR_D = 0, MIN_D = 0, YEAR_N = 0, MONTH_N = 0, DATE_N = 0, HOUR_N = 0, MIN_N = 0;
byte[] testimony1 = new byte[2];
byte[] testimony2 = new byte[2];
int MBCount = ((messByte.Count() - 12) / 11);
for (int i = 1; i < MBCount; i++)
{
n = i * 11;
if (messByte[n] == 0)
{
testimony1[0] = messByte[n + 1];
testimony1[1] = messByte[n + 2];
YEAR_D = messByte[n + 10]; MONTH_D = messByte[n + 9];
DATE_D = messByte[n + 8]; HOUR_D = messByte[n + 7];
MIN_D = messByte[n + 6];
}
else if (messByte[n] == 1)
{
testimony2[0] = messByte[n + 1];
testimony2[1] = messByte[n + 2];
YEAR_N = messByte[n + 10]; MONTH_N = messByte[n + 9];
DATE_N = messByte[n + 8]; HOUR_N = messByte[n + 7];
MIN_N = messByte[n + 6];
}
}
byte[] testimony1 = new byte[2];
byte[] testimony2 = new byte[2];
int MBCount = ((messByte.Count() - 12) / 11);
for (int i = 1; i < MBCount; i++)
{
n = i * 11;
if (messByte[n] == 0)
{
testimony1[0] = messByte[n + 1];
testimony1[1] = messByte[n + 2];
YEAR_D = messByte[n + 10]; MONTH_D = messByte[n + 9];
DATE_D = messByte[n + 8]; HOUR_D = messByte[n + 7];
MIN_D = messByte[n + 6];
}
else if (messByte[n] == 1)
{
testimony2[0] = messByte[n + 1];
testimony2[1] = messByte[n + 2];
YEAR_N = messByte[n + 10]; MONTH_N = messByte[n + 9];
DATE_N = messByte[n + 8]; HOUR_N = messByte[n + 7];
MIN_N = messByte[n + 6];
}
}
И как вы понимаете, в результате получалось, что элементы testimony1[0], testimony1[1], testimony2[0], testimony2[1] получают результат последних элементов массива. Т.е. если посмотреть на массив в сообщении выше, результат такой:
testimony1[0] = 15; //[111]
testimony1[1] = 0; //[112]
testimony2[0] = 5; //[122]
testimony2[1] = 0; //[123]
Я не знаю как мне написать алгоритм, что бы получилось:
testimony1[0] = 248; //[23]
testimony1[1] = 2; //[24]
testimony2[0] = 12; //[12]
testimony2[1] = 1; //[13]
И было бы условие, что если оба элемента testimony1[0] и testimony1[1] равны 0, то брать следующее значение, которое находится в блоке с нужным ключом.
PS:фух, вроде объяснил. Думаю дальше, но если есть мысли по этому поводу, поделитесь пожалуйста.
Все, решил проблему. Думаю правильно, но если есть советы, то прочитаю.
В общем надо сделать 2 цикла, один проверяет "1" другой "0", далее внутри цикла проверка содержимого необходимых данных, и если они равны нулю, то continue, если не равны то break и запускать второй цикл. В результате получаю что нужно.
Имхо как то топорно, но работает.
PS:хочу обратно, одминить, надоело программы писать :)