гекс неправильно оценивает - PullRequest
0 голосов
/ 29 сентября 2011

Я изо всех сил пытался решить этот вопрос самостоятельно, но я потратил много времени на что-то столь же простое, как это, поэтому я надеюсь, что кто-то может дать мне ответ.см. изображение ниже, но в основном я просто пытаюсь построить диапазон, но мой маркер и мой список никогда не встречаются, хотя есть элементы, которые соответствуют критериям.
в приведенном ниже примере я ищу 2c, и массив находится в позиции 11но просто идет мимо этого.
enter image description here

Я пробовал несколько разных способов, и приведенное выше сравнение работает просто отлично, поэтому я не понимаю, где моя проблема.я попытался просто сказать

== 0x2c (никогда не оценивает)

или использовать это так, как у меня было выше

`intValue`

, но это заставило его получить совпадение на 2D, котороемой тест состоит в том, что он усекает цифры до простого 2.

АКТУАЛЬНЫЙ КОД:

int lastIndexInPayload = ([payload count]-1);
            int beginningOfData = ([payload count]-1);
            NSString * endOfLine = [NSString stringWithFormat:@"%02X", 0x0D];
            NSString * startOfLine = [NSString stringWithFormat:@"%02X", 0x2C];

             if ([[payload objectAtIndex:lastIndexInPayload]intValue]  == [endOfLine intValue]) {

                 while ([payload objectAtIndex:beginningOfData]!= startOfLine) {
                     beginningOfData--;
                     DDLogVerbose(@"beginningOfData %d",beginningOfData);

                 }
            }

полезная нагрузка - это массив байтов, взятых из nsdata из возврата сокета

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Вы сравниваете строки по их адресу, а не по содержимому, вы должны использовать while (![[payload objectAtIndex:beginningOfData] isEqualToString:startOfLine]). Кроме того, почему вы пытаетесь использовать строки для шестнадцатеричных значений, а не просто сравнивать с 0xD напрямую? Ваш вызов intValue приведет к 0 для endOfLine, потому что он не знает, что это шестнадцатеричный код, и прекратит попытки анализа числа.

1 голос
/ 29 сентября 2011

Я думаю, это потому, что вы используете == для сравнения объектов. Поскольку кажется, что и ваш массив, и ваш startOfLine объект являются просто шестнадцатеричными строками, представляющими один байт, вам, вероятно, следует просто использовать -isEqualToString:, как в

while (![[payload objectAtIndex:beginningOfData] isEqualToString:startOfLine]) {

Тем не менее, я нахожу довольно странным, что ваша полезная нагрузка представляет собой массив шестнадцатеричных байтов, представленных в виде строк. Почему бы просто не запихнуть все это в NSData и не получить доступ к «настоящим» байтам?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...