代码之家  ›  专栏  ›  技术社区  ›  Taylor Johnson

c从套接字接收到无符号字符数组时的意外输出

  •  0
  • Taylor Johnson  · 技术社区  · 2 年前

    我有以下来自websocket Im的数据包有效载荷,用c语言进行解析。

    81 82 ce 5d 4d ac bf 57
    

    我用这样一个无符号字符数组接收它。

    unsigned char array[256];
    
    recv(new_socket, array, sizeof(array),0);
    

    但当我反复查看它时,它变得很时髦。。。

    while(i != 256){
    
            printf("%x\n", array[i]);
            
            i++;
        }
    
    #output:
    81
    82
    ce
    5d
    4d
    ac
    bf
    57
    40
    0
    0
    0
    0
    0
    0
    0
    40
    
    ... more zeros and bad hexes
    

    看起来前几个很好,但后来有些东西开始向我的buf中添加空值和随机的奇怪的十六进制数。这对我来说似乎很简单,但我是新手。你们能帮我修一下吗?

    1 回复  |  直到 2 年前
        1
  •  1
  •   David Grayson    2 年前

    假设您使用的是标准 recv function from Linux ,函数返回类型为的值 ssize_t 它指定接收的字节数。您应该查看返回值,只打印这么多字节。如果打印的字节数超过这个数,那么只需从数组中打印未初始化的字节,所以它们可以是任何内容。

    通过在定义数组时用零初始化数组,可以使输出更清晰,并帮助避免未定义的行为:

    unsigned char array[256] = {};