Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
目标C中Java的DataOutputStream等价_Java_Objective C_Ios_Dataoutputstream_Bytearrayoutputstream - Fatal编程技术网

目标C中Java的DataOutputStream等价

目标C中Java的DataOutputStream等价,java,objective-c,ios,dataoutputstream,bytearrayoutputstream,Java,Objective C,Ios,Dataoutputstream,Bytearrayoutputstream,我目前正在从事一个目标C中的项目 我需要使用Java类DataOutputStream的函数,比如writeChars,writeLong,flush,以及一些ByteArrayOutputStream类的函数 具体来说,我可以在与DataOutputStream和ByteArrayOutputStream类具有相同功能的Objective C中使用什么 这是我需要转换成Objective C的代码 public static byte[] getByteArray(String key, lo

我目前正在从事一个目标C中的项目


我需要使用Java类
DataOutputStream
的函数,比如
writeChars
writeLong
flush
,以及一些
ByteArrayOutputStream
类的函数


具体来说,我可以在与
DataOutputStream
ByteArrayOutputStream
类具有相同功能的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;
}
上述方法将字符串和对象作为参数。 作为

NSLog(@“嗨,这是字符串打印的演示。”)

NSLog(@“Hi这是整数%d”,intValue)//这就像printf,不是吗?

编辑:


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

这有点简化,请注意,当Java编写字符串时,前两个字节始终是字符串长度。Java也用大端写数字。我们正在按系统字节顺序编写它们。如果您不想将二进制数据发送到其他设备,那么这应该不是问题

您可以使用
CFByteOrderUtils.h
中的实用程序切换字节顺序,也可以通过以下方式直接获取大端数字:

- (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)]
}

二进制数据的等价物是什么?
DataOutputStream
仅适用于Big-Endian格式的二进制数据。问题是,;目标CEither%b中的等效项是什么,或者将其转换为NSData对象,然后使用%@打印。Obj-c使用%@表示所有类型的对象。我会使用writeUTF来写字符串,这可能更有效,更容易解码。@Rahul:请告知它是否有效?
- (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)]
}