Я хочу упаковать MIDI-сообщение в объект NSData.Упаковка в байты (NSData)
int messageType = 3; // 0-15
int channel = 5; // 0-15
int data1 = 56; // 0-127
int data2 = 78; // 0-127
int packed = data2;
packed += data1 * 127;
packed += channel * 16129; // 127^2
packed += messageType * 258064; // 127^2 * 16
NSLog(@"packed %d", packed);
NSData *packedData = [NSData dataWithBytes:&packed length:sizeof(packed)];
int recovered;
[packedData getBytes:&recovered];
NSLog(@"recovered %d", recovered);
Это прекрасно работает и в то время как я горжусь собой, я знаю, что преобразование в байты не будет сделано правильно: это должно быть прямым преобразованием без большого количества операций сложения и умножения. Как это можно сделать?
Edit: Теперь я знаю, что я могу просто сделать это
char theBytes[] = {messageType, channel, data1, data2};
NSData *packedData = [NSData dataWithBytes:&theBytes length:sizeof(theBytes)];
и на стороне Java
byte[] byteBuffer = new byte[4]; // Receive buffer
while (in.read(byteBuffer) != -1) {
System.out.println("data2=" + byteBuffer[3]);
}
и он будет работать, но я бы хотел, решение получить NSData всего за 3 байта.
там * * проблема с контентом в вашем примере. проходящей через const void *, когда длина> 1 требует рассмотрения в конце. значения массива char будут переупорядочиваться, когда встречаются устройства с различной степенью точности. – justin
Спасибо @Justin. Я не согласен, но я задам еще один вопрос здесь, на короткое время, чтобы прояснить это несоответствие. Я должен попросить его в удобное время суток, чтобы мы получили некоторые мнения экспертов. –
Спасибо @ Justin, я задал вопрос здесь http://stackoverflow.com/questions/3710669/ints-to-bytes-endianess-a-concern –