我正在尝试读取 WebP 图像标题,根据WebP 容器规范扩展文件格式。
fun get24bit(data: ByteArray, index: Int): Int {
return ((data[0 + index].toInt()) or (data[1 + index].toInt() shl 8) or (data[2 + index].toInt() shl 16))
}
fun get32bit(data: ByteArray, index: Int): Int {
return get24bit(data, index) or (data[3 + index].toInt() shl 24)
}
// data -> File(fileName).readBytes() for testing purpose
fun webpExtract(data: ByteArray) {
println(String(data.copyOfRange(0, 4)))
println("Size: ${get32bit(data, 4)}")
println(String(data.copyOfRange(8, 12)))
println(String(data.copyOfRange(12, 16)))
// 16, 17, 18, 19 reserved
val width = 1 + get24bit(data, 20)
val height = 1 + get24bit(data, 23)
println("Width: $width, Height: $height")
}
输出是:
RIFF
Size: -52
WEBP
VP8X
Width: 17, Height: 32513
字符串输出没问题,但大小变为负值,宽度和高度错误,即它们应该分别为 128 和 128(对于我使用的测试图像)。
代码有问题吗?我不知道出了什么问题。
我还验证了实际的 C++ 实现在github上。我的代码执行相同的位移,但结果不正确。据我所知,左移与无符号和有符号右移没有任何关系?