2014-12-02 161 views
0

我宣布一个IP地址:C++:隐蔽INT为unsigned char

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

然后,我需要将其转换为(无符号字符*)。我试图这样做:

(u_char*)test_ip 

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

0xff21a8c0 <Bad Ptr> 

我在做什么错?为什么坏Ptr?

+4

'(u_char *)&test_ip' – Borgleader 2014-12-02 17:46:52

+1

您的错误是您将IP地址转换为指针,而不是'test_ip'的地址。 – SHR 2014-12-02 17:54:04

+1

你确定你不是真的在找'inet_ntoa'吗? – zwol 2014-12-02 17:59:27

回答

1

尝试c样式转换会给你未定义的行为,因为指针类型是不相关的。最好的办法是使用int类型的静态浇铸,模256

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

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

一旦你把这个转换为无符号字符,把它的地址作为你的指针& c。

如果你想要test_ip的其他部分,然后与积分除等组合。只要注意不要在进行演员时溢出无符号字符。

+0

不幸的是,我不明白:( – Gooman 2014-12-02 17:56:19

+0

哪一点我没有解释得很好? – Bathsheba 2014-12-02 17:56:59

+0

你的意思是:'(u_char *)&test_ip'? – Gooman 2014-12-02 17:58:06

2

您的转换更好地组in_addr数据类型来完成:

这是一个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个字节数组...

+0

编号No.可能由于结构打包而不能工作。一个数组虽然可以工作 – Bathsheba 2014-12-02 18:15:05

+0

'S_addr'是'u_long'但我需要一个'u_char'变量的整个IP地址。 – Gooman 2014-12-02 18:16:11

+0

现在它应该工作。因为数组没有对齐。你可以得到指针 – SHR 2014-12-02 18:17:43

0

想必,你需要它作为一个unsigned char*将它传递给 一些协议。在这种情况下,您不能仅投射,因为int的 位表示不一定是 协议所期望的。您必须逐字节地提取它,就像您构建它的 一样,将这些字节放置在缓冲区中的一个unsigned char 缓冲区中。

相关问题