我们在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
转自:http://blog.youkuaiyun.com/jxncwzb/article/details/6694425