数据类型在网络传输中的表现

使用弱类型语言(PHP、Python等)开发接口的时候,有时会不考虑数据类型的问题,因为语言的解释器会自动进行类型转换。当一种强类型语言根据文档调用弱类型语言开发的接口,此时弱类型语言的开发者如果没去仔细关注返回的数据类型,结果可能给接口调用方造成不便。

下面的例程使用PHP开发

1<?php
2header("Content-type:application/json");
3$arr = [ 
4    "hello" => "world",
5    "value" => "100",
6    "aaaa" => 100,
7    "chinese" => "中文字符"
8];
9echo json_encode($arr);

抓取http报文后可以看到字符串被转换成二进制后的表示如下

{% asset_img wireshark.png %}

整型100和字符串"100"的二进制表示的区别在于字符串"100"比整型100多出了两个双引号("")

1整型100     =>            00110001 00110000 00110000
2字符串"100" =>   00100010 00110001 00110000 00110000 00100010

双引号(")、1和0的ascii码的二进制表示形式是

1"   => 00100010
21   => 00110001
30   => 00110000

所以整型100和字符串"100"在网络传输过程中本质上都是字符串,需要通过ascii转换成对应的二进制。注意,这里中文字符串被转换成了unicode,然后对unicode中的每个字符又对应到ascii转换成相应的二进制,例如:

1 -> \u4e2d -> 01011100 01110101 00110100 01100101 00110010 01100100
2 -> \u7b26 -> 01011100 01110101 00110111 01100010 00110010 00110110

虽然本质上都是字符串,但http报文被解析之后在应用层的表现形式会是各种数据类型,进而在内存中占用不同的空间。