C++ 从int64_t变量中提取八位字节

C++ 从int64_t变量中提取八位字节,c++,C++,我想从int64_t变量中提取八位字节数 到目前为止,我找到的代码如下,但它没有在数据数组中存储正确的值: typedef unsigned char uint8_t; typedef long long int64_t; uint8_t* extractOctets(int64_t& attribute, int number_of_octets) { uint8_t data[257]; for (int i = 0; i < number_of_octet

我想从int64_t变量中提取八位字节数

到目前为止,我找到的代码如下,但它没有在数据数组中存储正确的值:

typedef unsigned char uint8_t;
typedef long long int64_t;


uint8_t* extractOctets(int64_t& attribute, int number_of_octets)
{
    uint8_t data[257];
    for (int i = 0; i < number_of_octets; i++)
    {
        data[i++] = (uint8_t) (attribute >> (8 * i));
    }
    return data;
}

/*
I want to store the octets in this order.
data[0] = high_octet
data[1] = middle_octet
.
.
.
data[number_of_octets-1] = low_octet
*/
您正在返回指向局部变量的指针。在调用代码中声明数据或为其分配内存。 数组长度8足以存储提取的字节。 不需要显式传递八位字节的数量。您可以使用sizeof属性计算它。 不要对uint8和uint64使用typedef。按照托马斯·马修斯的建议使用include。
以下更改实现了您所需的功能。请注意,我试图保持接近您的原始界面,但由于它的问题,我不得不对其进行一些更改。在这里,我提供了作为输出参数的八位组数组。当您试图返回指向函数局部变量的指针时,上面的解决方案不起作用。有很多其他的或者更好的方法来解决这个问题,但是这与你的设计非常接近

void extractOctets(int64_t& attribute, uint8_t (&octets)[sizeof(int64_t)])
{
    for (int i = 0; i < sizeof(int64_t); i++)
    {
        octets[i] = (uint8_t) (attribute >> (8 * (7 - i)));
    }
}

int main()
{
    int64_t attr = (1 << 7) + (1 << 15);
    uint8_t octets[8];

    extractOctets(attr, octets);

    std::copy(std::begin(octets), std::end(octets), std::ostream_iterator<int>(std::cout, " "));
}

当代码清晰地使用C++特性时,它不能是C。请删除C语言标记。代码显示未定义的行为-有两个未排序的评价,其中一个增量i和另一个读取其值。我很确定您需要数据[I]=…并且返回指向局部变量的指针也是一个非常糟糕的主意。现在您正试图从一个void函数返回一些内容。@RAB请不要使用答案中建议的修复方法编辑问题。这将使答案无效,并改变问题的含义。正如我所说的,我试图不太多地更改原始实现,因为您正在转换为不同于OP的endianness。好吧,他的代码下面的注释与他的实现不一致。我决定实现我认为他想要的,在代码下的注释中。太好了,我错过了。