0

我在将通过套接字接收的十六进制/二进制值转换为整数时遇到问题。

我正在使用以下代码通过套接字获取十六进制值:

void get_msg(int sockfd, char *buf)
{
  int n;
  bzero(buf,256);
  n = read(sockfd,buf,255);
  if (n < 0)
    error("ERROR writing socket");
}

然后我将接收到的位于 *buf 中的二进制文件传递给这个函数,以十六进制查看它们(这样我就可以检查下面的 calc_msg 函数是否正常工作):

void print_msg(char *buf)
{
  int i;
  char *buffer = malloc(4);
  printf("[ ");
  for(i = 0; i < 4; i++) {
    printf("%02x ", ((const unsigned char *) buf)[i] & 0xff);
  }
  printf("]\n");
}

现在,为了将收到的消息转换为十进制,我调用了这个函数:

void calc_msg(char *buf)
{
  int i;
  int dec[3];
  for(i = 0; i < 4; i++) {
    dec[i] = buf[i];
    printf("Transformation %d: %u\n", i, dec[i]);
  }
}

此功能有时仅转换消息。其他时候,它给出了高得离谱的价值。这是一个示例输出:

[ 94 cc 78 28 ]
Transformation 0: 4294967188
Transformation 1: 4294967244
Transformation 2: 120
Transformation 3: 40

如您所见,94 和 cc 最终是荒谬的值,而 78 和 28 转换得很好。我看到的唯一关系是这只发生在更高的值上。我没有使用搜索引擎找到任何有用的信息。

谢谢!苏库勒斯

4

2 回答 2

2

int dec[3];应该是int dec[4];,对于初学者。

此外,这可能会发生,因为所有大于 127 的值(假设是 8 位字符,但这通常适用于任何不适合有符号的值char)在有符号向上转换 ( ) 期间进行符号扩展char -> int。你最好在unsigned char *任何地方使用你的缓冲区。

于 2013-08-10T16:43:07.543 回答
0

十六进制94 and cc是 148 和十进制的 204。您正在尝试将其存储在签名的字符中。不能存储超过 +127 的号码。这导致在 dec 中表示为负值。当您转换为时,unsigned int将转换为较大的值。

于 2013-08-10T17:02:00.807 回答