1

如标题中所述,我需要将包含 8 个字节(代表 64 位 int)的 (char) 数组转换为字符串。我在 NEC78K0R(16 位单片机)上使用 c 代码。我正在使用 IAR Embedded Workbench IDE。

我的想法是将它们以 64 位 int 类型(如 fx long long 或 int64_t(来自 stdint.h))进行 OR,然后使用 sprintf 之类的东西将其转换为字符串。

然而,每当我使用任何标准的 64 位整数类型时,编译器都会开始吐出诸如“'long long' 类型不存在'之类的错误。

任何帮助都感激不尽。

4

3 回答 3

1

如果 char 数组引用了一个 8 字节的内存块,它实际上是一个真正的 64 位整数,并且您的编译器支持int64_t,您可以只强制转换和取消引用。

int64_t convert(const char* input)
{
    return *((int64_t*)input);
}

如果平台支持 64 位数据类型,sprintf也会用%L格式说明符支持它。

如果您的编译不支持任何64 位数据类型,则需要使用特定的库来为您处理它们,例如BigIntGMPlib

于 2013-05-21T14:02:47.057 回答
0

您没有指定您需要的字符串的编码。最简单的可能是使用十六进制编码并直接打印字节。

printf("0x%02x%02x%02x%02x%02x%02x%02x%02x", a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0]);

为了提高效率,如果这对您来说是一个瓶颈,您可以将平台支持的最大部分分组,方法是将其转换为unsigned longeg 但是如果您的char数组满足必要的对齐方式以被解释为这样,请注意unsigned long. 如果您不能保证,您应该首先使用memcpy将数据复制到正确对齐的对象。

unsigned long b[2];
memcpy(b, a, sizeof b);
printf("0x%08x%08x", b[1], b[0]);

(假设unsigned long是 4 个字节)

于 2013-05-21T14:27:21.947 回答
0

如果long是适当的 32 位整数类型和十六进制格式就可以了,就做

char * p = <address of some memory containing a true 64bit number>
char s[19];

对于 Little Endian 平台:

sprintf(s, "0x%08x%08x, *((long*)(p+4)), *((long*)(p)));

对于 Big Endian 平台:

sprintf(s, "0x%08x%08x, *((long*)(p)), *((long*)(p+4)));
于 2013-05-21T14:21:24.447 回答