在 Racket 中读取一个字节的值
Reading the value of a byte in Racket
在我的程序中,我必须通过 TCP/IP 进行通信。
为此,我必须整理要发送的数据。
有时我想发送一个整数,这完全适合一个字节。
在 Racket 中,一个整数(0 <= 数字 < 256)被认为是一个字节。
所以例如我发送:
(write 15 outputPort)
(flush-output outputPort)
在另一端,接收方必须解组接收到的数据。
所以我这样做:
(define (loop)
(if (byte-ready? inputPort)
(display (read-byte inputPort))
(loop)))
我假设它显示 15(因为 0 到 255 之间的所有数字都可以放在一个字节中)但它显示 49,这是“1”的 ASCII 值。
如果我再循环一次,我将收到 53 作为第二个值,这是“5”的 ASCII 值。
那么有没有一种方法可以从 0 到 255 之间的值生成一个字节而不将数字的每个数字转换为 ASCII 值,因为这会导致发送 N 个字节,其中 N 是数字中的数字位数。
如果不可能的话,Racket 中 bytes 的优势是什么?
因为我可以简单地将我的号码作为字符串发送:
(write (number->string 15) outputPort)
(flush-output outputPort)
然后通过读取字符串解组,然后以另一种方式转换:
(string->number (read-string length inputPort))
但我想使用字节以避免发送字符串(因为对字符串的操作成本很高)所以我可以为 0 到 255 之间的数字发送一个字节而不是可能的 3 个字节(当数字包含 3 位数字时) ).
您想使用 write-byte
,而不是 write
:
-> (write-byte 61)
=
-> (write 61)
61
如果您使用 write-byte
而不是 write
,它实际上将发送字节值而不是值的序列化表示。
同样,您可以使用write-bytes
逐字节写出字节串。
在我的程序中,我必须通过 TCP/IP 进行通信。 为此,我必须整理要发送的数据。 有时我想发送一个整数,这完全适合一个字节。
在 Racket 中,一个整数(0 <= 数字 < 256)被认为是一个字节。 所以例如我发送:
(write 15 outputPort)
(flush-output outputPort)
在另一端,接收方必须解组接收到的数据。 所以我这样做:
(define (loop)
(if (byte-ready? inputPort)
(display (read-byte inputPort))
(loop)))
我假设它显示 15(因为 0 到 255 之间的所有数字都可以放在一个字节中)但它显示 49,这是“1”的 ASCII 值。 如果我再循环一次,我将收到 53 作为第二个值,这是“5”的 ASCII 值。
那么有没有一种方法可以从 0 到 255 之间的值生成一个字节而不将数字的每个数字转换为 ASCII 值,因为这会导致发送 N 个字节,其中 N 是数字中的数字位数。
如果不可能的话,Racket 中 bytes 的优势是什么? 因为我可以简单地将我的号码作为字符串发送:
(write (number->string 15) outputPort)
(flush-output outputPort)
然后通过读取字符串解组,然后以另一种方式转换:
(string->number (read-string length inputPort))
但我想使用字节以避免发送字符串(因为对字符串的操作成本很高)所以我可以为 0 到 255 之间的数字发送一个字节而不是可能的 3 个字节(当数字包含 3 位数字时) ).
您想使用 write-byte
,而不是 write
:
-> (write-byte 61)
=
-> (write 61)
61
如果您使用 write-byte
而不是 write
,它实际上将发送字节值而不是值的序列化表示。
同样,您可以使用write-bytes
逐字节写出字节串。