C ++:将int转换为unsigned char

时间:2014-12-02 17:45:37

标签: c++ int

我宣布了一个IP地址:

int test_ip = (192) | (168<<8) | (33<<16) | (255<<24);

然后我需要将其转换为(unsigned char *)。我试着这样做:

(u_char*)test_ip

我使用VS 2010 C ++调试器来评估最后一个表达式。此表达式的调试器输出:

0xff21a8c0 <Bad Ptr>

我做错了什么?为什么选择Bad Ptr?

3 个答案:

答案 0 :(得分:2)

您的转换最好通过in_addr数据类型完成:

这是windows in_addr所以如果你想在linux上使用它,你必须用其他名称重新声明它。

typedef struct in_addr {
  union {
    struct {
      u_char s_b[4];
    } S_un_b;
    struct {
      u_short s_w[2];
    } S_un_w;
    u_long S_addr;
  } S_un;
};
像这样:

in_addr address;
address.S_addr = (192) | (168<<8) | (33<<16) | (255<<24);

address.S_un_b.s_b现已准备就绪,4字节数组代表地址......

答案 1 :(得分:1)

尝试c样式转换将为您提供未定义的行为,因为指针类型不相关。最好的办法是使用int的静态强制转换,模256。

unsigned char c = static_cast<unsigned char>(test_ip % 256)

这是安全的,因为标准保证unsigned char的大小为8位。

将此演员表转换为unsigned char后,将其地址作为指针&amp; c。

如果你想要test_ip的其他部分然后与整数除法等结合使用。注意不要在进行演员表时溢出unsigned char。

答案 2 :(得分:0)

据推测,你需要它作为unsigned char*传递给它 一些协议。在这种情况下,你不能只是演员,因为 您int的位代表不一定是什么 协议期望。你必须逐字节提取它,就像 你构造它,把字节放在unsigned char 缓冲液中。