inet_addr 和 汉字转数字方法

函数inet_addr是如何实现将地址转换为数字的?
如:192.168.0.211 转成以后为 3540035776
即把192.168.0.211转成十六进制,如:C0A800[补位]D3,倒过来,D300A8C0(从高位取起)
然后把D300A8C0转成数字为3540035776即所求值。
在DELPHI中要引用这个函数,必须要引用winsock这个包,然后调用inet_addr(IP地址)这个函数
ip地址为字符串指针(Pchar类型),如PChar('192.168.000.211')这个值,返回的是DWORK型(即无符号的,占四个
字节的整型),和DELPHI的long word等同,如
User WinSock;
var
abc:DWORD;
begin
abc := inet_addr(PChar('192.168.0.211'));
Edit1.Text := IntToStr(abc);

汉字转数字,首先要了解一个汉字占用几个字符?即几个字节?一个汉字占两个字节,即2个字符,2个ASC码值
,这样的话就好办多了,首先把汉字转成ASC码值,再把对应的每个ASC码值转成数字,即是所求的数字
如:我的ASC码值是0xced2[十六进制表示]转成:十进制52946,即为所要求的值,按ALT+52946即可验证此数字是
否准确。
查看方法:程序->附件->字符映射表->高级查看->windows 简体中文->按拼音分类的简体中文 ->查看到对应的
汉字
DELPHI中实现方法为:
数转汉字:
sName := '';
for i := 1 to Length(FPassGroupName) do
begin
sName := sName + IntToStr(Integer(FPassGroupName[i]));
end;
汉转数字:
for i := 1 to Length(sExp) do
begin
sNameCode := sNameCode + IntToStr(Integer(sExp[i]));;
end;
sStr := sStr + sNameCode;
#include <winsock2.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <malloc.h> #define DOWNLOAD_PATH ".\\download\\" #define INT_SIZE sizeof(int) #define REQUEST_SIZE 35 #define PORT 7788 #define BUFFER_SIZE 1024 #define STOP_BYTE 0xFF #define VIDEO_LEN 60 // 视频总时长为60s int main() { /***初始化阶段***/ WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); int sock = 0; struct sockaddr_in serv_addr; char buffer[BUFFER_SIZE] = {0}; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("Socket creation error"); return -1; } else printf("Client Create Socket Success. \n"); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { perror("Connection Failed"); return -1; } else printf("Client Connect Server Success. \n"); /*****************************************************************/ /********** 任务1: 如何向server循环请求连续的视频文件?**********/ /*****************************************************************/ // 发送下载请求 int bytes_sent = 0; unsigned char s_stop_byte = 0xFF; // 视频文件名 char req[REQUEST_SIZE] = "ocean-1080p-8000k-0.ts"; /******************************************************************/ /***************** 任务2:如何按顺序选择视频文件?*****************/ /******************************************************************/ bytes_sent = send(sock, req, REQUEST_SIZE, 0); if (bytes_sent < 0) printf("ERROR in send\n"); bytes_sent = send(sock, &s_stop_byte, sizeof(s_stop_byte), 0); if (bytes_sent < 0) printf("ERROR in send\n"); printf("send req: %s\n", req); // 接收文件的大小 int file_size; unsigned long file_size_buf; int bytes_recv = 0; bytes_recv = recv(sock, (char *)&file_size_buf, INT_SIZE, 0); file_size = ntohl(file_size_buf); printf("file_size %d \n", file_size); // 接收视频片段 char *video_segement = malloc(file_size); if (video_segement == NULL) { perror("malloc failed"); // 处理内存分配失败的情况,可能需要退出程序 return -1; } int recv_count = 0; while (recv_count < file_size) { /************************************************************************/ /***************** 任务3 : 如何使用buffer接收视频文件?*****************/ /************************************************************************/ } unsigned char r_stop_byte; if (recv(sock, &r_stop_byte, 1, 0) != 1 || r_stop_byte != STOP_BYTE) printf("ERROR in receiving stop byte 0x%02X \n", r_stop_byte); // 检查文件结束符 r_stop_byte = 'e'; // 重置 // 写入文件 char file_path[40] = DOWNLOAD_PATH; strcat(file_path, req); printf("file_path %s \n", file_path); FILE *fp = fopen(file_path, "wb"); // 以二进制模式打开文件,并返回文件指针 if (fp == NULL) { perror("fopen"); exit(EXIT_FAILURE); } fwrite(video_segement, 1, file_size, fp); /***数据接收完成阶段***/ // 释放内存 free(video_segement); video_segement = NULL; /*************************************************************************************/ /*********任务2(扩展):如何在视频流传输完成后,通知server结束视频传输?*************/ /*************************************************************************************/ /***结束阶段***/ closesocket(sock); WSACleanup(); return 0; }
最新发布
04-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值