在服务器中,我先获取图像数据的长度,然后通过TCP套接字获取图像数据。如何将长度(十六进制)转换为十进制,以便我知道应该读取多少图像数据? (例如,0x00 0x00 0x17 0xF0到6128字节)
char len[4];
char buf[1024];
int lengthbytes = 0;
int databytes = 0;
int readbytes = 0;
// receive the length of image data
lengthbytes = recv(clientSocket, len, sizeof(len), 0);
// how to convert binary hex data to length in bytes
// get all image data
while ( readbytes < ??? ) {
databytes = recv(clientSocket, buf, sizeof(buf), 0);
FILE *pFile;
pFile = fopen("image.jpg","wb");
fwrite(buf, 1, sizeof(buf), pFile);
readbytes += databytes;
}
fclose(pFile);
编辑:这是有效的。
typedef unsigned __int32 uint32_t; // Required as I'm using Visual Studio 2005
uint32_t len;
char buf[1024];
int lengthbytes = 0;
int databytes = 0;
int readbytes = 0;
FILE *pFile;
pFile = fopen("new.jpg","wb");
// receive the length of image data
lengthbytes = recv(clientSocket, (char *)&len, sizeof(len), 0);
// using networkd endians to convert hexadecimal data to length in bytes
len = ntohl(len);
// get all image data
while ( readbytes < len ) {
databytes = recv(clientSocket, buf, sizeof(buf), 0);
fwrite(buf, 1, sizeof(buf), pFile);
readbytes += databytes;
}
fclose(pFile);
答案 0 :(得分:3)
如果您将号码归零,那么它就变成一个字符串(假设您将数字作为字符发送),您可以使用strtoul
。
如果您将其作为二进制32位数发送,则已根据需要使用它。您应该为它使用不同的数据类型:uint32_t
:
uint32_t len;
/* Read the value */
recv(clientSocket, (char *) &len, sizeof(len));
/* Convert from network byte-order */
len = ntohl(len);
在设计二进制协议时,您应始终使用标准的固定大小数据类型,例如上例中的uint32_t
,并始终以网络字节顺序发送所有非文本数据。这将使协议在平台之间更加便携。但是,您不必转换实际的图像数据,因为它应该已经是与平台无关的格式,或者只是普通的数据字节,没有任何字节顺序问题。