如何使用 struct.unpack 并将其转换为 Objective-c 中的值

Posted

技术标签:

【中文标题】如何使用 struct.unpack 并将其转换为 Objective-c 中的值【英文标题】:How to use struct.unpack and convert it to a value in Objective-c 【发布时间】:2011-04-17 17:22:25 【问题描述】:

Python 中的代码

struct.unpack("

从文件中读取数据,然后使用read, 我的问题是我们如何在 Objective-c 中使用、读取和 struct.unpack

我有 NSFileHandle 格式的数据,我可以逐字节读取,所以现在读取不是问题。问题是将我得到的 NSData 转换为(int、short、float、string)。

【问题讨论】:

【参考方案1】:

我不了解 Objective-C,但在纯 C 中你可以使用 fread():

#include <inttypes.h> /* uint32_t and PRIu32 macros */
#include <stdbool.h> /* bool type */
#include <stdio.h>

/* 
   gcc *.c && 
  python -c'import struct, sys; sys.stdout.write(struct.pack("<I", 123))' |
  ./a.out 
*/

static bool is_little_endian(void) 
  /* Find endianness of the system. */
  const int n = 1;
  return (*(char*)&n) == 1; /* 01 00 00 00 for little-endian */


static uint32_t reverse_byteorder(uint32_t n) 
  uint32_t i;
  char *c = (char*) &n;
  char *p = (char*) &i;
  p[0] = c[3];
  p[1] = c[2];
  p[2] = c[1];
  p[3] = c[0];
  return i;


int main() 
  uint32_t n; /* '<' format assumes 4-byte integer */

  if (fread(&n, sizeof(n), 1, stdin) != 1) 
    fprintf(stderr, "error while reading unsigned from stdin");
    return 1;
  

  if (! is_little_endian()) 
    /* convert from big-endian to little-endian ('<' format) */
    n = reverse_byteorder(n);

  printf("%" PRIu32 " 0x%08x\n", n, n);
  return 0;

输出

123 0x0000007b

【讨论】:

我应该补充一下,我的文件在 NSFileHandle 或 NSData 中。 @Jonathan Shepherd:使用此信息更新您的问题

以上是关于如何使用 struct.unpack 并将其转换为 Objective-c 中的值的主要内容,如果未能解决你的问题,请参考以下文章

将大端字节数组转换为 int,如 python 中的 struct.unpack

如何使用 python struct.unpack

如何在python中从pyserialtransfer的数字列表中重建结构。

解包单通道波形数据并将其存储在数组中

使用 struct.unpack_from() 解包混合二进制数据

struct.unpack() struct.error: unpack 需要 124 字节的缓冲区