将十六进制数据发送到设备(将NSString转换为十六进制数据)

时间:2011-08-23 16:44:46

标签: objective-c cocoa nsstring hex nsdata

我正在尝试通过WiFi发送十六进制数据。

代码是这样的:

NSString *abc = @"0x1b 0x50";
NSData *data = [[[NSData alloc] initWithData:[abc dataUsingEncoding:NSASCIIStringEncoding]]autorelease];
[outputStream write:[data bytes] maxLength:[data length]]];

它不是发送十六进制数据,而是以文本格式发送。 我尝试了NSUTF8StringEncoding,但它是一样的。我正在使用NSStream类。

2 个答案:

答案 0 :(得分:2)

你没有得到NSString *abc = @"0x1b 0x50"的期望。它与NSString *abc = @"cat dog 123 0x0x0x"几乎相同;只是一堆由空格分隔的单词。因此,当您创建NSData对象时,您只是使用一串字符初始化它,而不是一系列实际数字。

如果您可以将您的号码加到NSArray,这个问题/答案可以帮助您:How to convert NSArray to NSData?

答案 1 :(得分:0)

您可能想要发送的数据只是0x1b50,即十进制数6992(假设为big-endian),并且适合两个字节。这与字符串(可能包含任何内容)不同,即使它恰好包含这些数字的一些人类可读表示。

我假设您要将其作为二进制数据发送,如果是这样,一种方法是简单地发送由单个UInt16而不是字符串形成的缓冲区。我不是很熟悉相关的API,但是看看你是否可以使用整数填充NSData,可能是这样的:

UInt16 i = 0x1b50; // Or = 6992
[[NSData alloc] initWithBytes: &i length: sizeof(i)]

[outputStream write: [data bytes] maxLength: [data length]]];

同样,我不熟悉Objective C,但这应该是将数字0x1b50作为二进制数据发送的一般方法。