2

我目前正在开发一个目标 C 中的项目。

我需要使用 Java 类的函数,如 ,DataOutputStreamwriteCharsClass的一些函数。writeLongflushByteArrayOutputStream

具体来说,我可以在与DataOutputStreamandByteArrayOutputStream类具有相同功能的 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;
}
4

2 回答 2

0

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

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()是必要的(我相信 JavaByteArrayOutputStream两者都不需要)

这有点简化了,注意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)]
}
于 2012-12-06T11:19:38.197 回答
0
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
于 2012-12-06T11:01:26.193 回答