Как объявить необработанные двоичные / шестнадцатеричные данные в ObjC и как передать их в качестве аргумента? - PullRequest
2 голосов
/ 19 июля 2011

Это то, что у меня есть в Python:

ourAddr = Binary('\x4c\x6f\x8c')

Мне нужно объявить это в ObjC, а затем передать его скрипту Python, запущенному на другом сервере.

Вот как я пытался:

char *addr = "\x4c\x6f\x8c";

NSArray *hex = [NSArray arrayWithObjects: [NSNumber numberWithChar: addr], nil];
[waitOnEvent setMethod:@"waitOnEvent" withObjects: hex];

Но я получаю ответ: «Предоставлен нелицензионный адрес», из-за чего я думаю, что он неправильно видит переменную «addr». Любой совет будет принята с благодарностью.

Заранее спасибо!

EDIT:

Я отправил его как строку, выполнив следующее:

NSString *const hex = @"4c6f8c"

NSArray *pass = [NSArray arrayWithObjects:hex, nil];

NSString *server = @"http://192.168.0.x:8080"; 
    XMLRPCRequest *waitOnEvent = [[XMLRPCRequest alloc] initWithHost:[NSURL URLWithString:server]];
    [waitOnEvent setMethod:@"waitOnEvent" withObjects:pass];

И вот что я получаю от сервера, когда пытаюсь передать эту строку:

16:23:08:448 INFO     http_server waitOnEvent(4c6f8c, )
16:23:08:470 INFO     http_server 192.168.0.x:52982 - -  "POST / HTTP/1.1" 200 458

16:23:08:477 INFO     http_server <?xml version='1.0'?>
<methodResponse>
<fault>
<value><struct>
<member>
<name>faultCode</name>
<value><int>1</int></value>
</member>
<member>
<name>faultString</name>
<value><string>&lt;type 'exceptions.RuntimeError'&gt;:Non-licensed address provided</string></value>
</member>
</struct></value>
</fault>
</methodResponse>

Ответы [ 2 ]

2 голосов
/ 20 июля 2011

Вы пытаетесь отправить свои данные в виде шестнадцатеричных строк в кодировке ASCII / UTF-8 или необработанных двоичных данных?

Если это последнее, вы можете сделать следующее (я использовал ваш код соответствующим образом):

const char addr[] = {0x4c, 0x6f, 0x8c};
NSData *data = [NSData dataWithBytes:addr length:sizeof(addr)];
NSArray *array = [NSArray arrayWithObject:data];
[waitOnEvent setMethod:@"waitOnEvent" withObjects:array];
0 голосов
/ 19 июля 2011

Ваш диагноз точный; согласно документации +numberWithChar:

Создает и возвращает объект NSNumber, содержащий заданное значение, рассматривая это как подписанный символ.

Таким образом, создаваемый вами NSNumber имеет значение, которое исходит от адреса, по которому ваша строка в стиле C выделена, и совершенно не связано со значением вашей строки.

Я не совсем уверен, что вы хотите, но я думаю, вероятно:

[NSNumber numberWithInt:0x4c6f8c]

Чтобы получить объект NSNumber с шестнадцатеричным примитивом C 0x4c6f8c, который составляет 5 009 292 в десятичном виде.

Если вы хотите поместить байтовые значения в массив и прочитать только итоговое значение, вам следует рассмотреть проблемы с порядком байтов, поскольку C является относительно низким уровнем, а Objective-C наследуется непосредственно от него. Вы можете использовать функцию C strtol, если у вас есть строка цифр C в любой базе от 2 до 36 и вы хотите получить из них целое число.

...