如何在目标C中将long long转换为8字节数组

时间:2013-05-31 12:11:33

标签: ios objective-c

在我的应用程序中,我必须将长长数字转换为8字节数组。然后我必须将8字节数组转换为十六进制字符串。能帮到我吗?我很兴奋。

2 个答案:

答案 0 :(得分:3)

进行整数/字节数组转换的一种方法是使用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);

答案 1 :(得分:0)

那会诀窍吗?

#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);
}