代码之家  ›  专栏  ›  技术社区  ›  PatPanda

java long to byte[](原语long,而不是long to byte数组)-两个实现之间不相等

  •  -1
  • PatPanda  · 技术社区  · 4 年前

    我以前有一小段代码:

    import com.datastax.oss.driver.shaded.guava.common.primitives.Ints;
    
    final long timeStamp        = Instant.now().getEpochSecond();
    final byte[] timeStampAsBytes = Ints.toByteArray((int) timeStamp);
    

    注意,这个库有一个外部依赖项,还有一个cast,所以我决定重构它,使它更清晰一点。

    final long timeStamp        = Instant.now().getEpochSecond();
    final byte[]        timeStampAsBytes2 = ByteBuffer.allocate(Long.SIZE / Byte.SIZE).putLong(timeStamp).array();
    

    然而,令人相当惊讶的是,这两者其实并不相等!

    final long          timeStamp        = Instant.now().getEpochSecond();
                final byte[] timeStampAsBytes = Ints.toByteArray((int) timeStamp);
                final byte[]        timeStampAsBytes2 = ByteBuffer.allocate(Long.SIZE / Byte.SIZE).putLong(timeStamp).array();
                if (Arrays.equals(timeStampAsBytes, timeStampAsBytes2)) {
                    System.out.println("EQUAL");
                } else {
                    System.out.println("NOT EQUAL"); //this got printed
                }
    

    final byte[] timeStampAsBytes = Ints.toByteArray((int) timeStamp);

    1 回复  |  直到 4 年前
        1
  •  2
  •   rzwitserloot    4 年前

    注意,整数中的秒是 -因为2038年已经过去了一半。那个可笑的“2000年虫子”马拉基比2k38问题离现在更远。毫英寸长是通常的策略,这将使你非常远(数百万年)。你也可以在长时间里做几秒钟。。。效率没有提高(仍然是8字节),所以只有在明确不想存储空闲毫秒部分时才这样做。