将存储在char中的十六进制/二进制值转换为int - 获得奇怪的结果

时间:2013-08-10 16:37:35

标签: c type-conversion

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

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

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转换得很好。我看到的唯一关系是,这只发生在更高的值上。我没有使用搜索引擎找到任何有用的信息。

谢谢! Surculus

2 个答案:

答案 0 :(得分:2)

对于初学者来说,

int dec[3];应为int dec[4];

此外,这可能是因为所有大于127的值(假设一个8位字符,但对于任何不符合有符号char的值都是如此)都会在签名转发(char -> int)。你最好在任何地方使用unsigned char *缓冲区。

答案 1 :(得分:0)

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