순환 버퍼 문제
순환 버퍼는 http 이밖에 ini 설정 같은 데서도 사용되는 여지가 있어요.
블록 크기가 32이면 32보다 큰 값은 못가져 오는 거여요. 실제 구현에서는 1024 버퍼 정도를 사용하여서 일반적으로 문제가 없겠쩌.
솔까 이거는 크기를 지정하지 않은 포멧에 문제가 있는 거여서 짧은 코드를 쓰고싶음 bencode처럼 일어오는 정확한 길이를 앞에 치면 되어요. size = read(2), read(size) 이럼 완성된 필드를 가져와서 결과적으로 오버헤드가 없쩌.
null 은 !, 개행은 |로 바껐쩌. (콘솔에 문자가 안나와서 혼나요.)
Kotlin Playground: Edit, Run, Share Kotlin Code Online
import kotlin.io.*
import kotlin.text.*
import kotlin.math.*
fun main() {
println("Hello, world!!!")
"name: John Doe|age: 30|email: john@example.com".reader().use { reader ->
val blockSize = 32
val buf = CharArray(blockSize)
var size: Int
var nextCursor = 0
var s = 0
var e = blockSize
var name = ""
var valu = ""
while(reader.read(buf, 0, e).also { size = it } > 0) {
println("%s / %s (%s)".format(buf.concatToString(), buf.concatToString(0, size), size))
block@ for(num in 0 until blockSize) {
val cursor = nextCursor.apply { nextCursor = (nextCursor + 1) % blockSize }
when(val chr = buf[cursor]) {
':' -> {
name = buf.concat2(s, nextCursor - 1)
s = nextCursor + 1
}
'!', '|' -> {
valu = buf.concat2(s, nextCursor - 1)
println("%s / %s".format(name, valu))
buf[cursor] = '!'
s = nextCursor
e = nextCursor
name = ""
valu = ""
if(chr == '!') {
break@block
}
}
}
}
}
}
}
fun CharArray.concat2(s: Int, e: Int): String {
return buildString {
for(i in s until s + (s - e).absoluteValue) {
append(this@concat2[i % this@concat2.size])
}
}
}
