2013-03-05 226 views
0

在服务器中,首先获取图像数据的长度,然后通过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); 
+1

“二进制十六进制数据”是什么意思?它可以是二进制或十六进制。你在寻找类似'ntohl'的东西吗? **将这4个字节写入流的代码在哪里? – Jon 2013-03-05 11:42:46

+0

@Jon。谢谢! – askingtoomuch 2013-03-05 12:43:37

回答

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,始终将所有非 - 网络字节顺序的文本数据。这将使协议在平台之间更加便携。但是,您不必将实际图像数据转换为应该已经处于独立于平台的格式,或者只是没有任何字节排序问题的普通数据字节。

+5

使用网络端!我们不要鼓励人们在网络上写x86嵌入式时,htonl会让架构独立。 – 2013-03-05 11:54:39

+0

@joachim我无法使它工作...错误C2664:'recv':无法将参数2从'uint32_t'转换为'char *' – askingtoomuch 2013-03-05 12:31:05

+0

@boogiedoll您错过了操作符的地址?您还可能需要键入指针。 – 2013-03-05 12:32:55

相关问题