如何在ObjC中声明原始二进制/十六进制数据并将其作为参数传递?
这是我在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><type 'exceptions.RuntimeError'>:Non-licensed address provided</string></value>
</member>
</struct></value>
</fault>
</methodResponse>
2 个回答
0
你的判断是对的;根据文档,+numberWithChar:
这个方法会创建并返回一个NSNumber对象,里面包含一个给定的值,并把这个值当作一个有符号的字符来处理。
所以你创建的NSNumber对象的值是来自于你的C风格字符串的内存地址,而和你字符串的实际内容没有关系。
我不太确定你想要什么,但我觉得可能是:
[NSNumber numberWithInt:0x4c6f8c]
想要创建一个NSNumber对象,值是来自C语言的十六进制数0x4c6f8c,换算成十进制是5,009,292。
如果你想把字节值放进一个数组里,并只读取总值,你需要考虑字节序的问题,因为C语言比较底层,而Objective-C是直接从C语言继承过来的。如果你有一个包含数字的C字符串,想从中得到一个整数,可以使用C语言的函数strtol
,这个函数支持从2到36的任意进制。
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];