hamid18 Ответов: 2

Как я могу расшифровать раздел CDATA различных XML-файлов, имеющих различные datawidth, равное


<?xml version="1.0" encoding="UTF-8"?>
<TesterLog Version="1">
  <TestProperties>
    <Item name="IUT Name" value="Reference"/>
  </TestProperties>
  <SignalData SamplingPeriod="1000.000 ns" DataWidth="16 bit">
    <Signal>
      <Id>IUT_RX</Id>
      <InitState>1</InitState>
      <![CDATA[HQFPAVkBiwGVAZ8BqQHHAdEBAwINAjUCPwJxAnsCrQK3AsEC1QLzAv0CEQMbAzkDTQNrA3UDfwOJA7sDxQPtA/cDKQQzBEcEUQSDBI0EtQTJBN0E5wTxBAUFDwUZBS0FNwVBBUsFVQWHFZEVmxWlFa8VuRXDFc0V1xXhFesV9RX/FTEWOxZFFk8WgRaLFpUWnxapFscW0RbbFuUW7xYDFyEXPxdJF1MXGhgkGC4YTBhWGHQYfhiwGLoY2BjiGBQZHhkoGTIZUBlaGXgZghmgGaoZvhnbGeUZ9RwTHR0dTx1ZHYsdlR29Hccd+R0DHg0eFx5JHlMeZx6ZHsEe6R4lH5Qfsh+8H+4f+B8qIDQgXCBmIJggoiCsILYg6CDyIAYhOCFgIYghxCEzIlEiWyKNIpciySLTIvsiBSM3I0EjSyNVI4cjmyOlI9cj/yMTJB0kpyaxJrsmxSbPJgEnCyc9J0cnZSdvJ6EnqyfdJ+cnGSgjKC0oQShLKF8ocyiHKJsopSivKLkowyjWKOAo8jQkNS41YDVqNZw1pjXENc41ADYKNhQ2HjZGNlA2WjZkNm42eDaWNqo2tDbHNtE2uDd=]]>
    </Signal>
    <Signal>
      <Id>CCT_TX</Id>
      <InitState>1</InitState>
      <![CDATA[HQFPAVkBiwGVAZ8BqQHHAdEBAwINAjUCPwJxAnsCrQK3AsEC1QLzAv0CEQMbAzkDTQNrA3UDfwOJA7sDxQPtA/cDKQQzBEcEUQSDBI0EtQTJBN0E5wTxBAUFDwUZBS0FNwVBBUkXUxfbGeUZ1ijgKMc20Ta4N0==]]>
    </Signal>
//////////////////////////////////////////////////////////////////////////////////////////////////////
  </SignalData>
</TesterLog>

это мой xml-файл. я в состоянии прочитать информацию. но мой код очень статичен. он декодирует только те xml-файлы, в которых DataWidth составляет 16 бит. DataWidth-это атрибут элемента SignalData. Я хочу, чтобы мой код был таким образом, чтобы он работал для каждого типа DataWidth. e.g 8,16,24,32,40,48.... 64 и т. д.

Что я уже пробовал:

byte[] data = Convert.FromBase64String(cData);

int oldResult = 1;

ushort[] arr16 = new ushort[data.Length];

for (int i = 0; i < arr16.Length; i++)
            {
                arr16[i] = data[i];
            }

for (int i = 0; i < arr16.Length; i += 2)
                {
                var resultant = (arr16[i]) | (arr16[i + 1] << 8); //285 is the transition state.. As in xml file the initial state is 1 give. so signal will remain 1 till 284. on 285 signal becomes 0 and it will remain 0 before we reach another transition state... this will keep on doing like that. 

 for (int j = oldResult; j < resultant; j++)
                   {
                       Console.Write(initialState); // printing signal value. it can be either 1 or 0
 
                        
                    }
               
                   if (initialState == 1)
                        initialState = 0;
                    else
                       initialState = 1;

                    oldResult = resultant;

               
                }
Console.WriteLine();

2 Ответов

Рейтинг:
6

Patrice T

Цитата:
Как я могу расшифровать раздел CDATA различных XML-файлов, имеющих различные datawidth, равное

Независимо от того, каковы ваши данные, кодировка base 64 выполняется на массиве байтов, поэтому декодирование base64 может дать вам только массив байтов, независимо от его значения.
Итак, как только у вас есть байты, Вы читаете их группами в зависимости от ширины данных.


hamid18

спасибо..

Рейтинг:
13

Jochen Arndt

Таким образом, у вас есть образцы с различным количеством битов на образец. Чтобы избежать использования различных типов выходных массивов, вы можете сохранить результат в наибольшей поддерживаемой ширине (здесь 64).

Непроверенный пример:

// byte[] data is the input
// dataWidth is bits per sample (must be multiple of 8 and not larger than 64)

// bytes per sample
int bytes_per_sample = dataWidth / 8;
// Optional supporting dataWidth not being a multiple of 8
//if (dataWidth % 8)
//    bytes_per_sample++;

// total number of samples
int num_samples = data.Length / bytes_per_sample;
UInt64[] samples = new UInt64[num_samples];
for (int i = 0; i < num_samples; i++)
{
    // Assign the lowest byte (the only with 8 bit samples)
    samples[i] = data[i * bytes_per_sample];
    // Add the remaining bytes each shifted left by multiples of 8
    for (int j = 1, uint shift = 8; j < bytes_per_sample; j++, shift += 8)
    {
        samples[i] |= data[i * bytes_per_sample + j] << shift;
    }
}
Обратите внимание, что вышеизложенное предполагает, что первые байты во входном потоке являются младшими байтами. Если это неприменимо, то приведенный выше код должен быть соответствующим образом изменен.


hamid18

спасибо. это сработало для меня.