我有一些看起来像这样的旧C代码:
#include <stdio.h>
#include <strings.h>
main()
{
FILE *output;
struct socket_cpacket
{
char type; /* CP_SOCKET */
char version;
char udp_version; /* was pad2 */
char pad3;
unsigned socket;
};
struct socket_cpacket sockPack;
bzero(&sockPack,sizeof(sockPack));
sockPack.type = 27;
sockPack.version = 4;
sockPack.udp_version = 10;
sockPack.pad3 = 0;
sockPack.socket = 0;
output = fopen("/tmp/sockPack.bin", "wb");
fwrite(&sockPack, sizeof(sockPack), 1, output);
}
我想在obj-c中复制这个功能,然后我开始使用NSCoding协议。
CP_Socket.h
#import <Foundation/Foundation.h>
@interface CP_Socket : NSObject <NSCoding>
{
@private
char type;
char version;
char udp_version;
char pad3;
unsigned int socket;
}
@property (readonly) char type;
@property (readonly) char version;
@property (readonly) char udp_version;
@property (readonly) char pad3;
@property unsigned int socket;
typedef enum {
mTYPE = 27,
mVERSION = 4,
mUDP_VERSION = 10,
} cpSocketEnum;
@end
和CP_Socket.m
#import "CP_Socket.h"
@implementation CP_Socket
#pragma mark ======== properties =========
@synthesize type;
@synthesize version;
@synthesize udp_version;
@synthesize pad3;
@synthesize socket;
- (id)init {
NSLog(@"init");
if( !( self = [super init] ) )
return nil;
type = mTYPE;
version = mVERSION;
udp_version = mUDP_VERSION;
pad3 = 0;
socket = 0;
return self;
}
#pragma mark ======== Archiving and unarchiving methods =========
//
// Archives and Serializations Programming Guide for Cocoa
// http://bit.ly/PAaRsV
//
// NSCoding Protocol Reference
// http://bit.ly/PAb1Rd
//
- (void)encodeWithCoder:(NSCoder *)coder
{
NSLog(@"encodeWithCoder");
[coder encodeBytes:[self type] length:1 forKey:@"type"];
//[coder encodeBytes:[self version] length:1 forKey:@"version"];
//[coder encodeBytes:[self udp_version] length:1 forKey:@"udp_version"];
//[coder encodeBytes:[self pad3] length:1 forKey:@"pad3"];
//[coder encodeInt:[self socket] forKey:@"socket"];
}
- (id)initWithCoder:(NSCoder *)coder
{
NSLog(@"initWithCoder");
}
@end
第一个问题,[编码器编码字符:[自我类型]长度:1 forKey:@“type”];发出警告。不兼容的整数到指针转换将'char'发送到'const uint8_t *类型的参数。
如何编码char?
我试过[编码器编码:[self type] forKey:@“type”];但是char!= int。
使用代码进一步了解它是如何工作的; obj-c代码生成的文件是280个字节,在文件中查看看起来像名称错误的类标识符。
我尝试过NSKeyedArchiver和NSArchiver的结果相同。
我不知道从哪里开始。 C代码生成一个8字节的文件。我希望obj-c代码在使用NSCoding协议等一些OO时做同样的事情。
我觉得我将不得不扩展NSCoder对象以使其工作。
任何帮助都将不胜感激。
答案 0 :(得分:0)
encodeBytes:length:forKey:
的第一个参数应该是指向要编码的缓冲区的指针,所以请使用你的ivar的地址:
[coder encodeBytes:&type length:1 forKey:@"type"];
或者创建一个临时变量,将属性访问的结果放在其中,并获取其地址。
使用encodeInt:forKey:
也应该有效(使用强制转换),但它会增加数据文件的大小。
如果您真的想要,您当然可以使用以下类别扩展NSCoder
:
@implementation NSCoder (BTEncodeChar)
- (void)BTencodeChar: (char)c forKey: (NSString *)key
{
[self encodeBytes:&c length:1 forKey:key];
}
@end
答案 1 :(得分:0)
我对NSCoding不太了解,但objC与C互操作很好。将现有代码放入带有params的函数中并调用它。