Kotlin 原语:如何将 ByteArrays 重新解释为通用多平台代码中的原语位?
Kotlin Primitives: How to reinterpret ByteArrays as the bits of primitives in Common Multiplatform code?
TL;DR 对于 Kotlin Multiplatform 是否有 C++ 的 reinterpret_cast<[primitive]>(bytes)
等价物?
基本上,我正在寻找的是以下功能:
您有一个长度为 4 个字节的 ByteArray。内容是
00 00 00 2A
然后应该有一些函数或运算符将这 4 个字节重新解释为 Int
:
asInt(byteArrayOf(0x00, 0x00, 0x00, 0x2A))
理想情况下,还有一种方法可以控制此操作的字节顺序。最重要的是,我希望它能在所有可用平台(JVM、JS、本机)上运行。问题是:有这样的操作吗?
目前,我正在做以下事情:
- 对于整数类型(Byte、Short、Int、Long),我使用 SHL / OR 来构造实际的原语。但这当然不如将值重新解释(可能还复制)为原始值那么有效,因为这些位已经处于正确的配置中
- 对于浮点值,我还在纠结:到目前为止,我还没有找到平台无关的解决方案,所以我使用
expect
/ actual
。我已经找到了 JVM 和 JS 的解决方案(虽然不是很满意),但我仍然不知道如何在 Native 上实现。如果事实证明整个问题没有通用的解决方案,如果有人能指出我的解决方案只是为了在 Native 上进行 Float / Double 转换,我将不胜感激。
非常感谢!
您现有的整数类型解决方案可能是多平台的理想选择。对于浮点值,您可以将它们与 int/long 相互转换
Double/Float.fromBits
and Double/Float.toRawBits
,然后使用您现有的整数类型解决方案。
TL;DR 对于 Kotlin Multiplatform 是否有 C++ 的 reinterpret_cast<[primitive]>(bytes)
等价物?
基本上,我正在寻找的是以下功能:
您有一个长度为 4 个字节的 ByteArray。内容是
00 00 00 2A
然后应该有一些函数或运算符将这 4 个字节重新解释为 Int
:
asInt(byteArrayOf(0x00, 0x00, 0x00, 0x2A))
理想情况下,还有一种方法可以控制此操作的字节顺序。最重要的是,我希望它能在所有可用平台(JVM、JS、本机)上运行。问题是:有这样的操作吗?
目前,我正在做以下事情:
- 对于整数类型(Byte、Short、Int、Long),我使用 SHL / OR 来构造实际的原语。但这当然不如将值重新解释(可能还复制)为原始值那么有效,因为这些位已经处于正确的配置中
- 对于浮点值,我还在纠结:到目前为止,我还没有找到平台无关的解决方案,所以我使用
expect
/actual
。我已经找到了 JVM 和 JS 的解决方案(虽然不是很满意),但我仍然不知道如何在 Native 上实现。如果事实证明整个问题没有通用的解决方案,如果有人能指出我的解决方案只是为了在 Native 上进行 Float / Double 转换,我将不胜感激。
非常感谢!
您现有的整数类型解决方案可能是多平台的理想选择。对于浮点值,您可以将它们与 int/long 相互转换
Double/Float.fromBits
and Double/Float.toRawBits
,然后使用您现有的整数类型解决方案。