在 ios 下实现 DataOutputStream 和 DataInputStream
来源:互联网 发布:巧克力与香子兰 知乎 编辑:程序博客网 时间:2024/05/20 10:11
我们在java通讯,常用 DataOutputStream 和 DataInputStream 这两个数据流,客户端是android和j2me 的话没有什么大问题,如果是iphone和bada就比较麻烦了。为解决这问题我在ios下封装了 DataOutputStream 和 DataInputStream 这两个类,提供大家参考。
//// DataOutputStream.h// DataStream//// Created by wangzhongbin on 11-8-16.// Copyright 2011 wangzhongbin. All rights reserved.//#import <Foundation/Foundation.h>// 数据输出流允许应用程序以适当方式将基本数据类型写入输出流中@interface DataOutputStream : NSObject {NSMutableData *data;NSInteger length;}// 将一个 char 值以 1-byte 值形式写入基础输出流中,先写入高字节。- (void)writeChar:(int8_t)v;//将一个 short 值以 2-byte 值形式写入基础输出流中,先写入高字节。- (void)writeShort:(int16_t)v;//将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。- (void)writeInt:(int32_t)v;//将一个 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。- (void)writeLong:(int64_t)v;//以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。- (void)writeUTF:(NSString *)v;//将一个 NSData byte数组写入输出流中,先写入高字节。- (void)writeBytes:(NSData *)v;//将此转换为 byte 序列。- (NSData *)toByteArray;@end
//// DataOutputStream.m// DataStream//// Created by wangzhongbin on 11-8-16.// Copyright 2011 wangzhongbin. All rights reserved.//#import "DataOutputStream.h"@implementation DataOutputStream- (id)init{ self = [super init];if(self != nil){data = [[NSMutableData alloc] init];length = 0;}return self;}- (void)writeChar:(int8_t)v {int8_t ch[1];ch[0] = (v & 0x0ff);[data appendBytes:ch length:1];length++;}- (void)writeShort:(int16_t)v {int8_t ch[2];ch[0] = (v & 0x0ff00)>>8;ch[1] = (v & 0x0ff);[data appendBytes:ch length:2];length = length + 2;}- (void)writeInt:(int32_t)v {int8_t ch[4];for(int32_t i = 0;i<4;i++){ch[i] = ((v >> ((3 - i)*8)) & 0x0ff);}[data appendBytes:ch length:4];length = length + 4;}- (void)writeLong:(int64_t)v {int8_t ch[8];for(int32_t i = 0;i<8;i++){ch[i] = ((v >> ((7 - i)*8)) & 0x0ff);}[data appendBytes:ch length:8];length = length + 8;}- (void)writeUTF:(NSString *)v {NSData *d = [v dataUsingEncoding:NSUTF8StringEncoding];NSInteger len = [d length];[self writeShort:len];[data appendData:d];length = length + len;}- (void)writeBytes:(NSData *)v {[data appendData:v];NSInteger len = [v length];length = length + len;}- (NSData *)toByteArray{return [[[NSData alloc] initWithData:data] autorelease];}- (void)dealloc{[data release];[super dealloc];}@end
//// DataInputStream.h// DataStream//// Created by wangzhongbin on 11-8-15.// Copyright 2011年 wangzhongbin. All rights reserved.//#import <Foundation/Foundation.h>// 从输入流读取基本数据类型的方法,以便解组自定义值类型@interface DataInputStream : NSObject {NSData *data;NSInteger length;}//- (id)initWithData:(NSData *)data;//+ (id)dataInputStreamWithData:(NSData *)aData;// 从输入流读取 char 值。- (int8_t)readChar;//从输入流读取 short 值。- (int16_t)readShort;//从输入流读取 int 值。- (int32_t)readInt;//从输入流读取 long 值。- (int64_t)readLong;//从输入流读取 NSString 字符串。- (NSString *)readUTF;@end
//// DataInputStream.m// DataStream//// Created by wangzhongbin on 11-8-15.// Copyright 2011年 wangzhongbin. All rights reserved.//#import "DataInputStream.h"@interface DataInputStream (PrivateMethods)- (int32_t)read;@end@implementation DataInputStream- (id)initWithData:(NSData *)aData { self = [self init];if(self != nil){ data = [[NSData alloc] initWithData:aData];}return self;}- (id)init{ self = [super init];if(self != nil){length = 0;}return self;}+ (id)dataInputStreamWithData:(NSData *)aData { DataInputStream *dataInputStream = [[self alloc] initWithData:aData]; return [dataInputStream autorelease];}- (int32_t)read{ int8_t v; [data getBytes:&v range:NSMakeRange(length,1)]; length++; return ((int32_t)v & 0x0ff);}- (int8_t)readChar { int8_t v; [data getBytes:&v range:NSMakeRange(length,1)]; length++; return (v & 0x0ff);}- (int16_t)readShort { int32_t ch1 = [self read]; int32_t ch2 = [self read]; if ((ch1 | ch2) < 0){@throw [NSException exceptionWithName:@"Exception" reason:@"EOFException" userInfo:nil]; } return (int16_t)((ch1 << 8) + (ch2 << 0)); }- (int32_t)readInt { int32_t ch1 = [self read]; int32_t ch2 = [self read]; int32_t ch3 = [self read]; int32_t ch4 = [self read]; if ((ch1 | ch2 | ch3 | ch4) < 0){@throw [NSException exceptionWithName:@"Exception" reason:@"EOFException" userInfo:nil]; } return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));}- (int64_t)readLong { int8_t ch[8]; [data getBytes:&ch range:NSMakeRange(length,8)]; length = length + 8; return (((int64_t)ch[0] << 56) + ((int64_t)(ch[1] & 255) << 48) + ((int64_t)(ch[2] & 255) << 40) + ((int64_t)(ch[3] & 255) << 32) + ((int64_t)(ch[4] & 255) << 24) + ((ch[5] & 255) << 16) + ((ch[6] & 255) << 8) + ((ch[7] & 255) << 0));}- (NSString *)readUTF { short utfLength = [self readShort]; NSData *d = [data subdataWithRange:NSMakeRange(length,utfLength)]; NSString *str = [[[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding] autorelease]; length = length + utfLength;return str;}- (void)dealloc{[data release];[super dealloc];}@end
- 在 ios 下实现 DataOutputStream 和 DataInputStream
- 在 ios 下实现 DataOutputStream 和 DataInputStream
- DataInputStream和DataOutputStream类
- DataInputStream和DataOutputStream
- DataInputStream和DataOutputStream
- DataInputStream和DataOutputStream类
- DataInputStream和DataOutputStream类
- DataInputStream和DataOutputStream
- DataOutputStream和DataInputStream
- DataInputStream和DataOutputStream
- 记录:DataInputStream和DataOutputStream
- Java DataInputStream 和 DataOutputStream
- DataInputStream和DataOutputStream源码理解
- java之DataInputStream和DataOutputStream
- java 数据流DataOutputStream和DataInputstream
- Java IO DataInputStream和DataOutputStream
- JavaSE DataInputStream和DataOutputStream流
- DataOutputStream、DataInputStream
- SAP_常用业务数据表2
- linux 查看磁盘使用率
- ORA-01033: ORACLE initialization or shutdown in progress
- 随机接入过程
- JQuery中使用Json
- 在 ios 下实现 DataOutputStream 和 DataInputStream
- .Net 绑定Dropdownlist的时自定义组合字段后显示
- 陆首群:MeeGo可规避专利费风险
- 弹出对话框源代码中抓取活动窗口图片
- STL自定义分配器
- SIB 在MAC层的传输
- LoadIcon
- 被黑中介坑了。。。
- 如何实现vc菜单弹出对话框