[英]Equivalent for DataOutputStream of Java in Objective C
我目前正在开发目标C中的一个项目。
我需要使用Java类DataOutputStream
函数,例如writeChars
, writeLong
, flush
和ByteArrayOutputStream
类的某些函数。
具体来说,我可以在具有与DataOutputStream
和ByteArrayOutputStream
类相同功能的Objective C中使用什么?
这是我需要转换为目标C的代码。
public static byte[] getByteArray(String key, long counter) throws IOException
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
if (key != null)
{
dos.writeChars(key);
}
dos.writeLong(counter);
dos.flush();
byte[] data = bos.toByteArray();
return data;
}
NSLog();
上面的方法将字符串和对象作为参数。 如,
NSLog(@"Hi this is demo of string printing.");
NSLog(@"Hi this is integer %d",intValue);//this is like printf isnt it?
编辑:
%b,或者将其转换为NSData对象,然后使用%@打印。 Obj-c对所有类型的对象使用%@。
unsigned int a = 0x000000FF;
NSLog(@"%x", a);//prints the most significant digits first
您需要将原始数据类型转换为原始字节。
NSMutableData* dataBuffer = [NSMutableData data]; //obj-c byte array
long long number = 123456LL; //note that long long is needed in obj-c to represent 64bit numbers
NSData* numberData = [NSData dataWithBytes:&number length:sizeof(number)];
[dataBuffer appendData:numberData];
NSString* text = @"abcdefg";
const char* rawText = [text cStringUsingEncoding:NSUTF8StringEncoding]; //java uses utf8 encoding
NSData* textData = [NSData dataWithBytes:rawText length:strlen(rawText)];
[dataBuffer appendData:textData];
return dataBuffer;
无需flush()
(我相信ByteArrayOutputStream
也不需要Java)
这有点简化,请注意,当Java编写字符串时,前两个字节始终是字符串长度。 Java还使用Big Endian编写数字。 我们以系统字节顺序编写它们。 如果您不想将二进制数据发送到其他设备,那应该不成问题。
您可以使用CFByteOrderUtils.h
实用程序来切换字节顺序,也可以通过以下方式直接在Big Endian中获取数字:
- (NSData*)bytesFromLongLong:(long long)number {
char buffer[8];
for (int i = sizeof(buffer) - 1; i >= 0; i--) {
buffer[i] = (number & 0xFF);
number >> 8;
}
return [NSData dataWithBytes:buffer length:sizeof(buffer)]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.