gpt4 book ai didi

f# - 将字符串转换为流

转载 作者:行者123 更新时间:2023-12-04 22:28:27 27 4
gpt4 key购买 nike

我正在尝试将字符串转换为字节流,以便我可以读取所述流。所以我正在做的是将字符串转换为 char 数组,然后将每个字符/字节写入 MemoryStream,然后将其包装在 BinaryReader

我尝试实现它的方式是这样的:

let readData (data:string) = 
let ms = new MemoryStream()
let bw = new BinaryWriter(ms)
data.ToCharArray() |> Array.iter (fun x -> bw.Write((byte)x))
let br = new BinaryReader(bw.BaseStream)
readStream 0 br

我后来尝试像这样阅读它
let rec readStream c (br:BinaryReader) =
let bytes = br.ReadBytes 16
printfn "Size read is: %i" bytes.Length

但是我的结果总是读取 0 字节,并且我已经验证该字符串显然不是 0 字节。我试过在 MemoryStream 上调用 Flush。

我错过了一些基本的东西还是另一种更明显的方法?

最佳答案

这是产生 MemoryStream 的非常低效的方法。 .专门针对这种应用程序,它有一个接受字节数组的构造函数:

let bytes = System.Text.Encoding.UTF8.GetBytes data
let stream = MemoryStream( bytes )

但即使这样也可能是矫枉过正。您尚未描述您的最终目标,但从您的代码来看,您似乎只想将字符串转换为字节数组。如果这是真的,那么您只需要 Encoding.GetBytes :
let readData (data:string) = System.Text.Encoding.UTF8.GetBytes data

.

类型转换时

另请注意,当您执行 (byte)x ,您显然希望这是一个“转换为字节”操作,就像在 C# 中一样,但事实并非如此。 F# 中的“强制转换”操作的表达方式不同(使用运算符 :>:?> ),它只能用于子/父类(super class)型(即继承的类和接口(interface))。不适用于原语。在 F# 中没有强制转换原始类型之类的东西。

你实际上在做的是调用一个名为 byte 的函数。 .所以那里不需要括号,F# 中的函数参数用空格指定,即 byte x .

这个函数确实将一个 char 转换为一个字节,但它只是通过获取 char 的第一个字节(字符是双字节的东西,你知道吗?)并丢弃第二个字节来实现。当您的 char 是 ASCII 时,这工作正常(第二个字节无论如何都是零),但如果不是,则会丢失数据。尝试转换为字节,然后再转换回字符:
let x = 'a'
let y = char (byte x)
> val y : char = 'a' // This worked

let x = 'Г'
let y = char (byte x)
> val y : char = '\019' // Oops

关于f# - 将字符串转换为流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44344061/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com