我宣布了一个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?
答案 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
缓冲液中。