3

我正在通过网络(来自 ac# windows 服务器)发送一个 8 字节的数值,我的 iDevice 需要接收该数值。该值是我的服务器(System.Int64)上的“长”变量。我检查了该值是否正确转换为字节数组,使用

byte[] valueBytes = BitConverter.GetBytes(mylongvalue);

数据通过 NSData 变量在 iDevice 上接收。我需要跳过前 3 个字节,然后读取接下来的 8 个字节来计算我的 long long 值。

我试过这个:

NSData * longlongValueBytes = [receivedData subDataWithRange:NSMakeRange(3,8)];
long long receivedLongLongValue = *(const long long *)[longlongValueBytes bytes];

但这仅适用于低于 128 的值。每个发送的高于或等于 128 的值在收到时总是返回 127。

我错过了什么?这可能与符号问题有关,还是与字节顺序问题有关?

谢谢你的帮助。

4

1 回答 1

3

您是否检查(使用调试器或一些NSLog)您的 NSData 的原始内容以确保它被正确接收?

尤其要检查您的不同系统(您的 Windows Server 和 iOS 设备)之间没有不同的字节顺序。通常,在向网络发送字节之前,请尝试确保它们以“网络字节顺序”表示,该顺序对应于“大端”顺序(最高有效字节在前),而不管发送方或接收方的字节序.

您可以NSLog(@"data: %@", longlongValueBytes);在代码中编写以查看数据的十六进制表示并检查您是否收到了预期的字节。

然后将这些字节转换为 a long long,试试这个而不是你的代码:

unsigned long long receivedLongLongValue = 0;
[longlongValueBytes getBytes:&receivedLongLongValue length:8];
NSLog(@"received long value: %llu", receivedLongLongValue);
于 2012-11-20T15:35:28.487 回答