【问题标题】:Equivalent for DataOutputStream of Java in Objective C等效于Objective C中Java的DataOutputStream
【发布时间】:2012-12-06 10:58:43
【问题描述】:

我目前正在开发一个使用 Objective C 的项目。

我需要使用Java类DataOutputStream的函数,比如writeCharswriteLongflushByteArrayOutputStream类的一些函数。

具体来说,我可以在具有与DataOutputStreamByteArrayOutputStream 类相同功能的Objective C 中使用什么?

这是我需要转换成 Objective 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;
}

【问题讨论】:

  • 我会使用 writeUTF 来写一个字符串,它可能更高效,更容易解码。
  • @Rahul:请告知它是否有效?

标签: java objective-c ios dataoutputstream bytearrayoutputstream


【解决方案1】:
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

【讨论】:

  • 二进制数据的等价物是什么?
  • DataOutputStream 仅适用于 Big Endian 中的二进制数据。问题是; Objective-C 中的等价物是什么
  • 要么 %b,要么将其转换为 NSData 对象,然后使用 %@ 打印。 Obj-c 使用 %@ 表示所有类型的对象。
【解决方案2】:

您想要的是将原始数据类型转换为原始字节。

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()(我相信Java 也不需要ByteArrayOutputStream

这里稍微简化了一点,注意Java写字符串时,前两个字节总是字符串长度。 Java 也用大端写数字。我们以系统字节顺序编写它们。如果您不想将二进制数据发送到其他设备,那应该不是问题。

您可以使用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)]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多