Ios Xcode NSdata垃圾

Ios Xcode NSdata垃圾,ios,xcode,networking,nsdata,garbage,Ios,Xcode,Networking,Nsdata,Garbage,我正在开发一个网络应用程序。。。但在通过网络发送之前,我正在测试数据的打包和解包。。。但是我得到了很多垃圾值 ui文本字段中的myfield。。我的标签是uilabel。。。按下按钮时调用mybutton方法 在rec方法中,x中的值(垃圾)在-231223432…之间变化。。。。至+3423423 另外,如果我想用这些数据打包nsstring,我将如何打包和解包它 enum { gkMessageSent, gkMessageNotsent }; -(void)rec:(NSData

我正在开发一个网络应用程序。。。但在通过网络发送之前,我正在测试数据的打包和解包。。。但是我得到了很多垃圾值

ui文本字段中的myfield。。我的标签是uilabel。。。按下按钮时调用mybutton方法

在rec方法中,x中的值(垃圾)在-231223432…之间变化。。。。至+3423423

另外,如果我想用这些数据打包nsstring,我将如何打包和解包它

 enum 
{
gkMessageSent,
gkMessageNotsent
};


-(void)rec:(NSData *)data
 {

const char *incomingPacket = (const char *)[data bytes];
char messageType = incomingPacket[0];

switch (messageType)
{


    case gkMessageSent: 
    {  


        float x = *(float *)(incomingPacket + 1 );
        // value of x are not correct here
        NSString *resultString = [[NSString alloc] initWithFormat:@"%f",x];

        mylabel.text= resultString;            

        break;
    }

    case gkMessageNotsent: 
    { 
        mylabel.text=@"2";
        break;
    }  

        default:
        mylabel.text=@"3";
        break;


}



 }


 -(IBAction)mybutton{


   float myvalue=[myfield.text floatValue];

    // i check myvalue here and its fine

NSMutableData *data= [NSMutableData dataWithCapacity:1+sizeof(float)];


int myrand=1+rand()%3;

if(myrand==1)
{
    char messageType = gkMessageSent;  
    [data appendBytes:&messageType length:1];


    [data appendBytes:&myvalue length:sizeof(float)];




}
else {
    char messageType = gkMessageNotsent;
    [data appendBytes:&messageType length:1];
    [data appendBytes:&myvalue length:sizeof(float) ];        


}


[self rec:data];  


 }
经过一些研究,我找到了一种将NSString打包到NSmutabledata中的方法,但无法找出解包的方法

-(IBAction)mybutton {






   float myvalue=300;


NSString *resultString = [[NSString alloc] initWithFormat:@"%.2f",myvalue];



NSMutableData *data=nil;

data= [NSMutableData dataWithCapacity:1+([resultString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]) ];


int myrand=1+rand()%3;

if(myrand==1)
{
    char messageType = gkMessageSent;  
    [data appendBytes:&messageType length:1];

    [data appendBytes:[resultString UTF8String] length:[resultString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];           



}
else {
    char messageType = gkMessageNotsent;
    [data appendBytes:&messageType length:1];

    [data appendBytes:[resultString UTF8String] length:[resultString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];         

    }


[self rec:data];   


}



-(void)rec:(NSData *)data{

const char *incomingPacket = (const char *)[data bytes];
char messageType = incomingPacket[0];

switch (messageType)
{


    case gkMessageSent: 
    {  


       // Have to get the String here

        break;
    }

    case gkMessageNotsent: 
    { 
        mylabel.text=@"2";
        break;
    }  

        default:
        mylabel.text=@"3";
        break;


}



}
绝不能通过网络发送大小未知的“原始”数据。如果您使用的是整数,则可以通过以下方式发送数据:不发送原始数据,而是将其字节顺序“更正”为“网络顺序”,然后在另一端反转该过程:

uint32t foo = htonl(myLong);
unsigned char *ptr = ...; // set to the start of the string
sscanf(ptr, "%f", &myFloat);
ptr += 20;
为了扭转这种局面:

uint32t myLong = ntohl(networkData4bytesLong);
浮动和双精度可以强制使用上述方法,但(据我所知)没有标准方法。即使要让下面的hack工作,float两边都必须是32位IEEE格式的类型(现在在大多数系统上可能是这样)

一种方法是创建一个包含long和float的联合:

struct foo {
  uint32_t lng;
  float flt;
};
您可能应该添加一个断言(sizeof(foo)==4);当然,双方也是如此

将浮子放入这种类型的接头中,然后使用htonl(foo.lng);转换,并在另一侧反转

也许更可靠(但更困难的方法)的方法是将浮点转换成字符串,发送它,然后转换回浮点类型。也就是说,上述假设适用于所列假设(IEEE,32位类型)

编辑:因此,如果要使用字符串,可以在发送的数据中附加一个以null结尾的字符串,使用“pascal”类型的字符串,其中第一个字节是长度,后面是一个以NOT null结尾的字符串,也可以允许一个固定的空间量,其中至少有一个以null结尾的字符串。为简洁起见,我将使用第三种方式,但在编写代码时,最好使用“pascal”方式

因此,为了100%确保我们有足够的空间,我们将为浮点分配20个字节(太多了):

另一方面:

uint32t foo = htonl(myLong);
unsigned char *ptr = ...; // set to the start of the string
sscanf(ptr, "%f", &myFloat);
ptr += 20;

我建议的第一件事是删除
开关
语句。当涉及到变量声明和赋值时,开关本质上是奇怪的,许多范围错误都发生在那里。@RichardJ.RossIII——开关没有(明显)问题。变量声明只有在单个
案例中的
{}
大括号中没有包含它们时才会出现问题。如果您使用NSLog在适当的点转储变量,然后向我们展示您得到了什么,这将非常有帮助。@HotLicks如何做到这一点。。。在哪一点上,为什么我被给予负面评价?我自己也这么认为。。。将e float转换为nsstring,然后发送。。。。Float to nsstring可以是don't,但无法找到一种将其打包并解包到nsdata中的方法……我已经在原始帖子中添加了一些代码,你能帮我解决解包问题吗