数据类型在网络传输中的表现
使用弱类型语言(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报文被解析之后在应用层的表现形式会是各种数据类型,进而在内存中占用不同的空间。