Как обнаружить ненулевое значение в двоичном файле? - PullRequest
2 голосов
/ 27 июля 2011

У меня есть проблема, которая мучает много часов.Мне нужно иметь возможность найти первое ненулевое значение в массиве (принимая во внимание, что после этого могут быть нули).

Так что если:

A [0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 48, 24, 0, 0, 18, 9, 9, 7, 8, 0];

Как мне установитьпеременная скажем, int origin;равный 9, такой, что A [origin] = 16?

Моя настоящая проблема более сложна, чем эта, но это, по сути, упрощенная версия того, что застряло у меня.Я на самом деле работаю с устройством Bluetooth, которое выводит сектора по 512 байт, однако каждый байт в этом секторе представляет разные вещи.Итак, я сделал цикл for для извлечения байта с номером 224, который мне интересен, затем я создал массив значений 224 для каждого сектора.Хотя все другие байты в секторе содержат данные, этот конкретный байт не начинает передачу намного позже.Поскольку я хочу анализировать данные, мне нужно знать, в каком секторе они начинают приносить пользу.Следовательно, у меня есть вопрос выше.Вся эта информация совершенно не имеет отношения к вопросу, но я предоставил ее для справки.

Кроме того, и если вы действительно хотите получить ответ, мне нужно вывести номер байта 224 как "широта", байт 225 как «долгота» и байт 226 как «угол места» (для GPS) в формате xml.Любые идеи о том, как я бы вывести свои трехбайтовые массивы в формате XML?Я читал, что они должны быть сначала в строковой форме, но это легко:

string [] Lat = new string [Sectors];
for (int i = 0, i < sectors; i++)
{
   Lat[i] = A[i].ToString();
}

В конце я бы хотел получить это в результате.

<document>
    <point lat = "50.0" lon = "-60.5" ele = "605">
        <time> 16:54:08 </time>
    </point>
    <point .... etc
</document>

Надеюсь, я дал вамдостаточно информации, и я буду полезен для любой помощи.ура всем!Кстати, весь код должен быть на C #, и я использую Visual C # 2010 Express.

1 Ответ

4 голосов
/ 27 июля 2011

Вы указываете «массив» в вопросе, что облегчает:

int index = -1;    
for(int i = 0 ; i < arr.Length ; i++)
{
    if(arr[i] != 0)
    {
        index = i;
        break;
    }
}

Теперь, если индекс неотрицательный, это индекс первого ненулевого значения. Значением будет arr [index].

Если вам нужно читать из FileStream, просто зациклите на Read и повторите. Есть взлом с небезопасным кодом, который вы можете использовать, чтобы сделать его немного быстрее, если вам нужно.

...