Ruby Ruby Socket,字符解码

liurui12w · 2019年09月12日 · 4712 次阅读

tcp Socket,字符解码

ruby有自带的 socket 库

require 'socket'      # Sockets 是标准库

hostname = 'localhost'
port = 2000

s = TCPSocket.open(hostname, port)

while line = s.gets   # 从 socket 中读取每行数据
  puts line.chop      # 打印到终端
end
s.close               # 关闭 socket

然后针对上面的做一点点小小的补充

s = TCPSocket.open(hostname, port)
s.read 14             #read X 以字节的模式来读取数据
# 我这个14个字节  "\xEA\xE5\n\x10pt\x00\x01\x00\x00\x00\x00\x00\xF5"

s.gets                #gets 语句可用于获取来自名为 STDIN 的标准屏幕的用户输入
#gets 会获取 "\xE5\n" 以\n结尾截取前面的字节
#"\x00\x00\x00\x00U\xEA\xE5\n"

s.getc                #获取一个字节,依次获取后面的字节
#2.4.1 :012 > s.getc
#    => "\xD0"
#   2.4.1 :013 > s.getc
#    => "t"
#   2.4.1 :014 > s.getc
#    => "\x00"
#   2.4.1 :015 > s.getc
#    => "\x01"

其他还有一些我就不说明了,这些都是 ruby 文件的输入与输出相关的命令

借鉴别人的帖子 https://www.jianshu.com/p/4bdb84dea93a


unpack 转码相关的 官方资料https://ruby-doc.org/core-2.6.4/String.html#method-i-unpack

#h 16进制字符串(下级半字节在先)
pack  unpack 互转
["10ef"].pack("h*") => "\001\376"
"\x01\xfe".unpack("h*") => ["10ef"]

#这里我针对的是对二进制进行解码
b = s.read(14) => "\x10\xFEt\x00\x01\x00\x00\x00\x00\x00\x83\xEA\xE5\n"

b.unpack('H*') => ["10fe740001000000000083eae50a"]
b.unpack('H*').pack('H*') => "\x10\xFEt\x00\x01\x00\x00\x00\x00\x00\x83\xEA\xE5\n"

pack/unpack 的摸板字符字符 含义

a 一个填充空的字节串
A 一个填充空格的字节串
b 一个位串,在每个字节里位的顺序都是升序
B 一个位串,在每个字节里位的顺序都是降序
c 一个有符号 char(8位整数)值
C 一个无符号 char(8位整数)值;关于 Unicode 参阅 U
d 本机格式的双精度浮点数
f 本机格式的单精度浮点数
h 一个十六进制串,低四位在前
H 一个十六进制串,高四位在前
i 一个有符号整数值,本机格式
I 一个无符号整数值,本机格式
l 一个有符号长整形,总是 32 位
L 一个无符号长整形,总是 32 位
n 一个 16位短整形,“网络”字节序(大头在前)
N 一个 32 位短整形,“网络”字节序(大头在前)
p 一个指向空结尾的字串的指针
P 一个指向定长字串的指针
q 一个有符号四倍(64位整数)值
Q 一个无符号四倍(64位整数)值
s 一个有符号短整数值,总是 16 位
S 一个无符号短整数值,总是 16 位,字节序跟机器芯片有关
u 一个无编码的字串
U 一个 Unicode 字符数字
v 一个“VAX”字节序(小头在前)的 16 位短整数
V 一个“VAX”字节序(小头在前)的 32 位短整数
w 一个 BER 压缩的整数
x 一个空字节(向前忽略一个字节)
X 备份一个字节
Z 一个空结束的(和空填充的)字节串
@ 用空字节填充绝对位置    
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号