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

发布于 2024-11-01 21:49:44 字数 273 浏览 1 评论 0原文

Python 代码

struct.unpack("< I",data.read(4))[0] # 解压为 int。

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

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

Code in Python

struct.unpack("< I",data.read(4))[0] # Unpack to int.

The data is read from a file, then read is used,
My question is how can we use, read and struct.unpack in Objective-c

I have the data in the format NSFileHandle which I could read byte by byte, so reading is not a problem now. The problem is converting the NSData I got into (int, short, float, string).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

坚持沉默 2024-11-08 21:49:44

我不了解 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

I don't know about Objective-C but in plain C you could use 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;
}

Output

123 0x0000007b
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文