【问题标题】:How to convert long long to 8 byte array in objective C如何在目标 C 中将 long long 转换为 8 字节数组
【发布时间】:2013-05-31 12:11:32
【问题描述】:

在我的应用程序中,我必须将 long long 数转换为 8 字节数组。然后我必须将 8 字节数组转换为十六进制字符串。你能帮我解决这个问题吗?我很兴奋。

【问题讨论】:

标签: ios objective-c


【解决方案1】:

进行整数/字节数组转换的一种方法是使用union

union {
    long long l;
    uint8_t b[sizeof(long long)];
} u;

u.l = mylonglong;

然后u.b[]包含字节,可以单独访问。

编辑:请注意@NikolaiRuhe 指出,这种使用union 会导致未定义的行为,因此最好改用memcpy()

uint8_t b[sizeof(long long)];
memcpy(b, &mylonglong, sizeof(b));

如果您希望 long long 的十六进制字符串以 native-endian 顺序排列,则:

void hexChar(uint8_t b, char *out)
{
    static const char *chars = "0123456789abcdef";
    out[0] = chars[(b >> 4) & 0xf];
    out[1] = chars[b & 0xf];
}

// Make sure outbuf is big enough
void hexChars(const uint8_t *buffer, size_t len, char *outbuf)
{
    for (size_t i = 0; i < len; i++)
    {
        hexChar(buffer[i], outbuf);
        outbuf += 2;
    }
    *outbuf = '\0';
}

并调用它:

char hex[32];
hexChars(u.b, sizeof(u.b), hex);

但是,如果您想要 long long 的十六进制值:

char hex[32];
sprintf(hex, "%llx", mylonglong);

【讨论】:

  • 我是新手。如果我做错了,你能纠正我吗?联合{长长l; uint8_t b[sizeof(long long)]; } 你; u.l = 长值; dataWithBytes=[NSData dataWithBytes:u.b 长度:sizeof(u.b)];然后我将 NSData 转换为十六进制字符串。但我得到了错误的结果。
  • @PremPalanisamy 是的,我觉得还可以。
  • @PremPalanisamy 您如何将NSData 对象转换为十六进制字符串?您是否考虑过字节序问题(即 iOS 和 OSX 在字节顺序颠倒时使用小字节序)?
  • 使用联合写入一个元素然后读取另一个依赖于未定义的行为。它可能适用于大多数平台,但 C 标准明确警告这一点。
  • @NikolaiRuhe 这让我很吃惊。可以给个链接吗?
【解决方案2】:

这样可以吗?

#include <stdio.h>
int main() {
    long long int val = 0x424242;
    char str_val[32];
    snprintf(str_val, sizeof(str_val), "%#llx", val);
    printf("Value : %s\n", str_val);
}

【讨论】:

  • 对不起,我假设你只需要把它放在一个字符串中。如果你真的需要得到你的 8 字节数组,请参阅 trojanfoe 的解决方案。
猜你喜欢
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
  • 2012-09-30
  • 2019-06-21
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多