我对此非常陌生并尝试使用通过将十进制数转换为浮点数生成的扩展十六进制代码(超过127的ascii字符),然后通过post命令将其发送到设备改变设定点。
我只是通过这样做来创建十六进制代码,
- (void)dec2float:(id)sender
{
NSString *dec = setPoint.text;
float flt = [dec floatValue];
unsigned char *bytes = (unsigned char *)&flt;
sPoint01 = [NSString stringWithFormat:@"%x", bytes[0]];
sPoint02 = [NSString stringWithFormat:@"%x", bytes[1]];
sPoint03 = [NSString stringWithFormat:@"%x", bytes[2]];
sPoint04 = [NSString stringWithFormat:@"%x", bytes[3]];
}
如果setPoint.text值是例如23,则将生成
sPoint01 = 00
sPoint02 = 00
sPoint03 = b8
sPoint01 = 41
然后必须将这些值作为十六进制字符串发送到设备,并将其连接在一起,
NSString *post = [NSString stringWithFormat:@"\\x%@\\x%@\\x%@\\x%@",sPoint01, sPoint02, sPoint03, sPoint04];
但是发送“0000b841”而不是“00005c78 62385c78 3431”。我假设这是因为Xcode不允许任何十六进制代码超过127,就好像我尝试输入它一样
@"\xb8"
Xcode告诉我“由于输入字节不属于输入代码集UTF-8,输入转换已停止。”
我是以正确的方式解决这个问题,还是我设法在错误的道路上走了很长一段路?
非常感谢任何帮助,欢迎任何建议。
提前谢谢
编辑:
您好, 感谢您的回复,这是我用来将数据发送给控制器的命令,希望它会有所帮助,
- (void)setACStatus:(id)sender
{
NSString *post = [NSString stringWithFormat:@"\x38\x00\x00\x00\x76\x11\x01\x00%@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1b\x00\x00\x00%@\x00%@%@\x00\x10\x00\x10%@%@%@%@%@\x00\x00\x00",
unitNumberString, onOffString, modeString, modeString2, sPoint01, sPoint02, sPoint03, sPoint04,
fanSpeedString];
postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@”%d”, [postData count];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@”http://10.38.140.9/cmd/”]];//<-- Controller address.
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/octet-stream" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
if( theConnection )
{
webData = [NSMutableData data];
}
else
{
NSLog (@"The Connection is NULL");
}
temp.text = [NSString stringWithFormat:@"%@",postData];
}
三江源。
答案 0 :(得分:0)
您似乎正在尝试从字符串创建NSData
对象,但您已经知道要包含的数据对象的字节数。而不是通过创建字符串并尝试将其转换为数据对象的额外步骤,只需从您的字节创建数据对象,如下所示:
typedef struct postDataType = {
unsigned char someData0[8];
int unitNumberString;
unsigned char someData1[33]; // or however many bytes it is
unsigned char onOffString;
// etc... rest of fields go here
} postDataType;
postDataType dataBytes = {
{0x38, 0x00, 0x00 0x00, 0x76, 0x11, 0x01, 0x00},
[unitNumberString intValue],
// etc... fill in the rest of the fields here with the data you want
};
postData = [NSData dataWithBytes:dataBytes length:sizeof(dataBytes)];