gpt4 book ai didi

objective-c - 将整数打包成字节 (NSData)

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:46 25 4
gpt4 key购买 nike

我想将 MIDI 消息打包到 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);

这非常有效,虽然我为自己感到自豪,但我知道到字节的转换没有正确完成:它应该是直接转换,没有大量的加法和乘法。怎么办?

编辑:我现在知道我可以做到这一点

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

它会工作,但我想要获得只有 3 个字节的 NSData 的解决方案。

最佳答案

就个人而言,我会选择 NSString:

NSString *dataString = [NSString stringWithFormat:@"%i+%i+%i+%i", messageType, channel, data1, data2];
NSData *packedData = [dataString dataUsingEncoding:NSUTF8StringEncoding];

易于使用,易于传输。拆包稍微复杂一点,但一点也不难。

NSScanner *scanner = [NSScanner scannerWithString:[[[NSString alloc] initWithData:packedData encoding:NSUTF8StringEncoding] autorelease]];
int messageType, channel, data1, data2;
[scanner scanInt:&messageType];
[scanner scanInt:&channel];
[scanner scanInt:&data1];
[scanner scanInt:&data2];

关于objective-c - 将整数打包成字节 (NSData),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3682297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com