Time 如何将UNIX时间戳转换为Kotlin中的UInt8数组?

Time 如何将UNIX时间戳转换为Kotlin中的UInt8数组?,time,kotlin,byte,unix-timestamp,uint,Time,Kotlin,Byte,Unix Timestamp,Uint,我需要将UNIX时间戳转换为Kotlin中的ByteArray。问题是,当我使用下面的代码执行此操作时,我会得到一个类似于C1F38E05(hex)的结果,它远远高于当前的历元时间 internal fun Int.toByteArray(): ByteArray { return byteArrayOf( this.ushr(24).toByte(), this.ushr(16).toByte(), this.us

我需要将UNIX时间戳转换为Kotlin中的
ByteArray
。问题是,当我使用下面的代码执行此操作时,我会得到一个类似于
C1F38E05
(hex)的结果,它远远高于当前的历元时间

internal fun Int.toByteArray(): ByteArray {
    return byteArrayOf(
            this.ushr(24).toByte(),
            this.ushr(16).toByte(),
            this.ushr(8).toByte(),
            this.toByte()
    )
}

val timeUTC = System.currentTimeMillis().toInt().toByteArray()

正确的方法是什么?

系统。currentTimeMillis()
返回一个
Long
,因此必须为
Long
实现
toByteArray
,如下所示:

fun Long.toByteArray(): ByteArray {                     
    val result = ByteArray(8)                           
    result[7] = (this and 0xFF).toByte()                
    result[6] = ((this ushr 8) and 0xFF).toByte()       
    result[5] = ((this ushr 16) and 0xFF).toByte()      
    result[4] = ((this ushr 24) and 0xFF).toByte()      
    result[3] = ((this ushr 32) and 0xFF).toByte()      
    result[2] = ((this ushr 40) and 0xFF).toByte()      
    result[1] = ((this ushr 48) and 0xFF).toByte()      
    result[0] = ((this ushr 56) and 0xFF).toByte()      
    return result                                       
}    
如果无符号字节需要此选项,请使用:

fun Long.toByteArray(): UByteArray {
    val result = UByteArray(8)
    result[7] = (this and 0xFF).toUByte()
    result[6] = ((this ushr 8) and 0xFF).toUByte()
    result[5] = ((this ushr 16) and 0xFF).toUByte()
    result[4] = ((this ushr 24) and 0xFF).toUByte()
    result[3] = ((this ushr 32) and 0xFF).toUByte()
    result[2] = ((this ushr 40) and 0xFF).toUByte()
    result[1] = ((this ushr 48) and 0xFF).toUByte()
    result[0] = ((this ushr 56) and 0xFF).toUByte()
    return result
}
这可以像以下示例中那样使用:

fun main() {
    val timeUTC = System.currentTimeMillis().toByteArray()    
    println(timeUTC.map { byte -> byte.toString(16).toUpperCase() }.joinToString(""))
}

如果需要32位值,则需要将时间转换为秒

fun Int.toByteArray() = byteArrayOf(
    this.toByte(),
    (this ushr 8).toByte(),
    (this ushr 16).toByte(),
    (this ushr 24).toByte()
)

val timeUTC = (System.currentTimeMillis() / 1000).toInt().toByteArray()

和0xFF
有什么意义?在强制转换为字节时,最左边的位将被截断。