如何在ObjC中声明原始二进制/十六进制数据以及如何在参数中传递它?

时间:2011-07-19 18:24:14

标签: python objective-c ios

这就是我在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'变量。任何建议都将不胜感激。

提前致谢!

编辑:

我通过执行以下操作将其作为字符串发送:

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 个答案:

答案 0 :(得分:2)

您是否尝试将数据作为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];

答案 1 :(得分:0)

您的诊断准确无误;根据文档+numberWithChar:

  

创建并返回包含给定值的NSNumber对象,   将其视为签名的字符。

因此,您正在创建的NSNumber的值来自您的C样式字符串恰好被分配的地址,并且与字符串的值完全无关。

我不完全确定你想要什么,但我想可能:

[NSNumber numberWithInt:0x4c6f8c]

从C十六进制原语0x4c6f8c给出一个NSNumber对象,即十进制的5,009,292。

如果要将字节值放入数组并只读取总值,则必须考虑字节序问题,因为C的级别相对较低,而Objective-C直接从它继承。如果您在2到36之间的任何基数中都有一个C字符串,并且想要从中获取整数,则可以使用C函数strtol