C++问题 inet_addr函数

ddfstt 2006-09-06 04:56:04
IP地址为四字节16进制数,值为报警中心IP的十六进制取值如:192.168.001.255,端口号1024的取值为C0H+A8H+01H+FFH+04H+00H四个字节,然后再将其扩充成ASCII码字串:
43H+30H+41H+38H+30H+31H+46H+46H+30H+34H+30H+30H

现有代码如下:

union UIP
{
char ip_item[4];
unsigned long Lip;
}U_IP;

U_IP.Lip=inet_addr(Edit1->Text.c_str());

// char ip[4];
// unsigned long inet_addr(const char * ip);
// long ip=inet_addr(Edit1->Text.c_str());

// PORT=htons(atoi( Edit2->Text.c_str() ) );
// short A,B,C,D;
// A=scanf("%x",U_IP.Lip);
FLG=0x28;

Memo1->Lines->Add(U_IP.Lip);

相关结构体已经定义...请高手帮忙...急...在线等
...全文
892 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
铖邑 2006-09-08
  • 打赏
  • 举报
回复
VCL Reference
IntToHex

See also Example

Returns the hex representation of an integer.

Unit

SysUtils

Category

numeric formatting routines

extern PACKAGE AnsiString __fastcall IntToHex(int Value, int Digits);
extern PACKAGE AnsiString __fastcall IntToHex(__int64 Value, int Digits);

Description

IntToHex converts a number into a string containing the number's hexadecimal (base 16) representation. Value is the number to convert. Digits indicates the minimum number of hexadecimal digits to return.



VCL Reference
IntToHex Example

The following example uses an edit control, a button, and a label on a form. When the button is clicked, the hexadecimal value of each character in the edit control is displayed in the label.

void __fastcall TForm1::Button1Click(TObject *Sender)

{
AnsiString EditText = Edit1->Text;
Label1->Caption = "";
for (int i=1;i<=EditText.Length();i++)
{
Label1->Caption = Label1->Caption + IntToHex(EditText[i],2) + " ";
}
}
ddfstt 2006-09-08
  • 打赏
  • 举报
回复
char aStr[17];

strcpy(aStr,Caption.c_str());
unsigned char Result;

for(int i = 0; i < sizeof(aStr); i ++)
Result += HexToASCII(Caption.c_str(),aStr[i]);


//aStr[2] = 0;


Memo1->Lines->Add(IntToStr(aStr[0]/16*10+(aStr[0])%16));
Memo1->Lines->Add(Caption);

我改成这样的了...IntToHex是怎么回事呀?
铖邑 2006-09-08
  • 打赏
  • 举报
回复
IntToHex
ddfstt 2006-09-08
  • 打赏
  • 举报
回复
unsigned char TAB[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

void HexToASCII(unsigned char hex ,char *ret)
{
ret[0] = TAB[hex>>4];
ret[1] = TAB[hex&0x0F];
//ret[2] = TAB[hex&0x000F];
}

这是我的函数

我是这样调用的

char a[12];

unsigned char aHex = 0x28;
char aStr[3];
//Caption.CurrToStrF(a,aStr);
HexToASCII(aHex,aStr);
aStr[2] = 0;


Memo1->Lines->Add(IntToStr(aStr[0]/16*10+(aStr[0])%16));

指针那我现在不知道怎么写呀,大哥指点一下把
铖邑 2006-09-08
  • 打赏
  • 举报
回复
自己写吧,不要这么懒。
不喜欢动脑筋就是偷懒。
ddfstt 2006-09-08
  • 打赏
  • 举报
回复
谢谢,大哥,但是实在不好意思...还是给请教您

现在 我输出的结果是一个16进制,可是结果要一个扩充的ASCii码,这个函数我还是写不出来...

43H+30H+41H+38H+30H+31H+46H+46H+30H+34H+30H+30H

多次麻烦您了...实在抱歉...可否拜你做师父丫
铖邑 2006-09-08
  • 打赏
  • 举报
回复
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Caption = GetAddrPortHex(Edit1->Text.c_str(), StrToInt(Edit2->text));
}
ddfstt 2006-09-08
  • 打赏
  • 举报
回复
谢谢了...

还剩最后一个问题

为什么端口显示 是反的...搞不懂

比如 1024 应该输出 0400 可为啥 是 0040

结果30 34 30 30

现在成了30 30 30 34
铖邑 2006-09-07
  • 打赏
  • 举报
回复
AnsiString GetAddrPortHex(const char *addr, u_short port)
{
unsigned char buf[6];
unsigned long l = inet_addr(addr);
memcpy(buf, &l, sizeof(l));
memcpy(buf + sizeof(l), &port, sizeof(port));
/*
unsigned char *p = (unsigned char *)&port;
buf[4] = p[1];
buf[5] = [p0];
*/
AnsiString Result;
for(int i = 0; i < sizeof(buf); i ++)
Result += IntToHex((int)buf[i], 2);
return Result;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
Caption = GetAddrPortHex("192.168.1.255", 1024);
}
ddfstt 2006-09-07
  • 打赏
  • 举报
回复
我问的问题就那么难吗??
ddfstt 2006-09-07
  • 打赏
  • 举报
回复
谢谢,回复,但是问题又来了

现在要求的是,IP地址和端口 都是从 两个文本框中得到

Edit1->text Edit1->text 我应该如何类型转换

再次感谢...帮大忙了

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧