在C++中将int转换为字节数组

4
我正在尝试使用Andrew Grant在回答这个问题中建议的LSB查找方法。然而,它导致了分段错误。下面是一个演示问题的小程序:
#include <iostream>

typedef unsigned char Byte;

int main()  
{  
    int value = 300;  
    Byte* byteArray = (Byte*)value;  
    if (byteArray[0] > 0)  
    {  
        std::cout<< "This line is never reached. Trying to access the array index results in a seg-fault." << std::endl;  
    }  
    return 0;  
}  

我做错了什么?
我看到说在C++中使用“C-Style”转换不是好的实践方法。那我应该使用reinterpret_cast<Byte*>(value)替代吗?尽管如此,这仍然导致分段错误。

5个回答

13
使用这个:
(Byte*) &value;
你不需要一个指向地址300的指针,而是需要一个指向存储300的位置的指针。因此,你使用取地址运算符&来获取value的地址。

修复了指针问题,但是给定问题中仍然不需要进行强制类型转换。 - Zac Howland

9

虽然Erik回答了你的整体问题,但是作为后续,我要强调一点——是的,应该使用reinterpret_cast而不是C风格的转换。

Byte* byteArray = reinterpret_cast<Byte*>(&value);

1
代码应该是这样的: Byte* byteArray = (Byte*)&value 你不需要在它前面加上(void *)。
-Chert

0
char *array=(char*)(void*)&value;

基本上,您需要获取字符串开头的指针,并将其重新转换为字节指针。


0
@Erik已经解决了你的主要问题,但你仍然有一个微妙的问题。如果你只是想找到最不重要的,根本不需要使用转换。
int main()
{
    int value = 300;       
    if (value & 0x00000001)       
    {           
        std::cout<< "LSB is set" << std::endl;
    }
    return 0;
}

他正在寻找最不显著的“设置”位的位置。很明显,即使没有任何字节数组,仍然可以找到它。 - Erik
在这种情况下,他的实现完全错误。他现在所拥有的只会检查最低字节是否等于1。 - Zac Howland
是的,但正如他所说,这段代码是一个特定问题的演示。我的回答解决了这个具体的问题。如果这是他真实的代码,那么它需要一些改进 :P - Erik
是的--对于混淆我感到抱歉。我发布的代码只是演示崩溃的示例。实际代码以类似的方式使用字节数组,但还有许多其他事情正在进行。 - peace_within_reach
没问题,但是无论哪种情况,在整数中找到最低位的设置位时,不需要进行字节强制转换。实际上,这样做会使它更加复杂。 - Zac Howland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接