【问题标题】:char[] to uint64_tchar[] 到 uint64_t
【发布时间】:2014-03-05 02:47:18
【问题描述】:

我正在尝试将char 的数组转换为uint64_t,但它不起作用。 这是我的代码:

char input[8];
//Initialisation of input
int i,j;
uint64_t paquet=0;
for(i = 0; i < 8; i++)
{
    for(j = 0; j < 8; j++)
    {
        paquet+= (input[i] >> j) & 0x01;
        paquet = paquet << 1;
    }
}

【问题讨论】:

  • unsigned char的数组开始会更有意义。
  • 你有规格吗?字节序问题?您希望如何进行此转换?如果sizeof(uint64_t) != 8怎么办?

标签: c binary char


【解决方案1】:

假设input 缓冲区以endian 表示形式存储了数据,这意味着最低有效字节位于最低地址,最高有效字节位于最高地址,那么您可以执行类似的操作关注。

#include <stdio.h>

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

int main(void) 
{
    int i;
    unsigned char input[8] = {0x01, 0x02, 0x03, 0x04, 0x5, 0x06, 0x07, 0x08 };
    uint64_t paquet = 0;
    for( i = 7; i >= 0; --i )
    {
        paquet <<= 8;
        paquet |= (uint64_t)input[i];
    }

    printf("0x%" PRIx64 "\n", paquet);

    return 0;
}

您可以在 ideone 上查看工作示例。

如果缓冲区以大端模式存储,则反转循环。

感谢m24p 指出我初稿中的一个错误。

【讨论】:

  • 这几乎是对的。你可能只想要一个像这样的循环。只是试图遵循双循环逻辑让我头疼。那将不是可读、可维护的代码。这非常接近正确。它有一个错误,即它在 or 之后移动。它需要在之前进行转变。否则,您将始终将 8 个最低有效位设为 0,并丢失前 8 个最高有效位。 :
  • 是的,有一个错误...只是在 ideone 上验证...已修复并感谢您指出这一点(+1)...非常尴尬!
  • 次要:建议PRIX64 更轻松地将paquet 匹配到input
【解决方案2】:

也许是这个?

uint64_t paquet = input[0]<<(8*7) | input[1]<<(8*6)
                                  | input[2]<<(8*5)
                                  | input[3]<<(8*4)
                                  | input[4]<<(8*3)
                                  | input[5]<<(8*2)
                                  | input[6]<<(8*1)
                                  | input[7];

【讨论】:

  • input[0]char 类型。对其执行移位不会导致大于int
【解决方案3】:
char input[8] = "\x01\x23\x45\x67\x89\xAB\xCD\xEF";
uint64_t paquet = *(uint64_t*)"\x1\x0\x0\x0\x0\x0\x0\x0";

if(paquet == 1){
    //reverse
    char *f=&input[0], *b=&input[7];
    while(f<b){
        char tmp = *f;
        *f++ = *b;
        *b-- = tmp;
    }
}
paquet = *(uint64_t*)input;//memcpy(&paquet, input, sizeof(input));

【讨论】:

  • +1 不错的字节序检测。 (注意:(uint64_t*)"\x1\x0...*(uint64_t*)input 可能由于对齐限制而失败。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2021-11-02
  • 2019-11-21
  • 2020-08-04
  • 1970-01-01
相关资源
最近更新 更多