我宣布一个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?
我宣布一个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?
尝试c样式转换会给你未定义的行为,因为指针类型是不相关的。最好的办法是使用int类型的静态浇铸,模256
unsigned char c = static_cast<unsigned char>(test_ip % 256)
因为标准保证unsigned char型的大小为8位这将是安全的。
一旦你把这个转换为无符号字符,把它的地址作为你的指针& c。
如果你想要test_ip的其他部分,然后与积分除等组合。只要注意不要在进行演员时溢出无符号字符。
您的转换更好地组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个字节数组...
想必,你需要它作为一个unsigned char*
将它传递给 一些协议。在这种情况下,您不能仅投射,因为int
的 位表示不一定是 协议所期望的。您必须逐字节地提取它,就像您构建它的 一样,将这些字节放置在缓冲区中的一个unsigned char
缓冲区中。
'(u_char *)&test_ip' – Borgleader 2014-12-02 17:46:52
您的错误是您将IP地址转换为指针,而不是'test_ip'的地址。 – SHR 2014-12-02 17:54:04
你确定你不是真的在找'inet_ntoa'吗? – zwol 2014-12-02 17:59:27