Ios 如何在objective C中将long-long转换为8字节数组

Ios 如何在objective C中将long-long转换为8字节数组,ios,objective-c,Ios,Objective C,在我的应用程序中,我必须将长数字转换为8字节数组。然后我必须将8字节数组转换成十六进制字符串。你能在这方面帮助我吗。我兴奋极了。进行整数/字节数组转换的一种方法是使用并集: union { long long l; uint8_t b[sizeof(long long)]; } u; u.l = mylonglong; 然后u.b[]包含可以单独访问的字节 编辑:请注意,@NikolaiRuhe指出,使用联合会导致未定义的行为,因此最好使用memcpy(): uint8_t

在我的应用程序中,我必须将长数字转换为8字节数组。然后我必须将8字节数组转换成十六进制字符串。你能在这方面帮助我吗。我兴奋极了。

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

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

u.l = mylonglong;
然后
u.b[]
包含可以单独访问的字节

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

uint8_t b[sizeof(long long)];
memcpy(b, &mylonglong, sizeof(b));
如果希望
long
的十六进制字符串以本机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';
}
但是,如果您需要
long-long
的十六进制值:

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

这样行吗

#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);
}
#包括
int main(){
长整型值=0x424242;
char str_val[32];
snprintf(str#val,sizeof(str#val),“%#llx”,val);
printf(“值:%s\n”,str_val);
}

长到十六进制字符串有多长?请参阅[如何获取整数的第n个字节][1],并根据需要进行修改。[1] :尝试此格式:
NSString*s=[nsstringwithformat:@“%08llx”,llVal]其中llVal是long long。对不起,我假设您只需要将其放入字符串中。如果你真的需要获得你的8字节数组,请参阅特洛伊敌人的解决方案。我对这一点不熟悉。如果我做错了,你能纠正我吗。联盟{long long l;uint8_t b[sizeof(long long)];}u;u、 l=长期价值;dataWithBytes=[NSData dataWithBytes:u.b长度:sizeof(u.b)];然后我将NSData转换为十六进制字符串。但是我得到了错误的结果。@PremPalanisamy是的,我觉得还可以。@PremPalanisamy如何将
NSData
对象转换为十六进制字符串?您是否考虑过endian问题(即iOS和OSX在字节顺序颠倒的情况下使用小endian)?使用并集写入一个元素然后读取另一个元素依赖于未定义的行为。它可能适用于大多数平台,但C标准明确警告了这一点。@NikolaiRuhe,这让我感到惊讶。你能提供一个链接吗?
#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);
}