在 Java 中获取数据类型大小(sizeof)的最佳实践

发布于 2024-11-25 16:49:01 字数 200 浏览 1 评论 0原文

我想将双精度和整数列表存储到 ByteBuffer,它要求分配大小。我想写一些类似C语法的东西

int size=numDouble*sizeof(double)+numInt*sizeof(int);

,但是Java中没有sizeof。计算字节大小的最佳实践是什么?我应该对其进行硬编码吗?

I want store a list of doubles and ints to a ByteBuffer, which asks for a size to allocate. I'd like to write something like C's syntax

int size=numDouble*sizeof(double)+numInt*sizeof(int);

But there is no sizeof in Java. What is the best practice to calculate the size in byte? Should I hardcode it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

情独悲 2024-12-02 16:49:01

请参阅下面的 @Frank Kusters 的回答

(我原来的答案是针对 Java 版本 < 8 的。)

See @Frank Kusters' answer, below!

(My original answer here was for Java versions < 8.)

帥小哥 2024-12-02 16:49:01

从 Java 8 开始,所有基本类型的包装类(除了 Boolean)都有一个 BYTES 字段。因此,在您的情况下:

int size = numDouble * Double.BYTES + numInt * Integer.BYTES;

文档:http://docs。 oracle.com/javase/8/docs/api/java/lang/Integer.html

Since Java 8, all wrapper classes of primitive types (except Boolean) have a BYTES field. So in your case:

int size = numDouble * Double.BYTES + numInt * Integer.BYTES;

Documentation: http://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html

只涨不跌 2024-12-02 16:49:01

写你自己的方法。在 Java 中,数据类型与平台无关,且大小始终相同:

public static int sizeof(Class dataType)
{
    if (dataType == null) throw new NullPointerException();

    if (dataType == int.class    || dataType == Integer.class)   return 4;
    if (dataType == short.class  || dataType == Short.class)     return 2;
    if (dataType == byte.class   || dataType == Byte.class)      return 1;
    if (dataType == char.class   || dataType == Character.class) return 2;
    if (dataType == long.class   || dataType == Long.class)      return 8;
    if (dataType == float.class  || dataType == Float.class)     return 4;
    if (dataType == double.class || dataType == Double.class)    return 8;

    return 4; // 32-bit memory pointer... 
              // (I'm not sure how this works on a 64-bit OS)
}

用法:

int size = numDouble * sizeof(double.class) + numInt * sizeof(int.class);

Write your own method. In Java the datatypes are platform independent always the same size:

public static int sizeof(Class dataType)
{
    if (dataType == null) throw new NullPointerException();

    if (dataType == int.class    || dataType == Integer.class)   return 4;
    if (dataType == short.class  || dataType == Short.class)     return 2;
    if (dataType == byte.class   || dataType == Byte.class)      return 1;
    if (dataType == char.class   || dataType == Character.class) return 2;
    if (dataType == long.class   || dataType == Long.class)      return 8;
    if (dataType == float.class  || dataType == Float.class)     return 4;
    if (dataType == double.class || dataType == Double.class)    return 8;

    return 4; // 32-bit memory pointer... 
              // (I'm not sure how this works on a 64-bit OS)
}

Usage:

int size = numDouble * sizeof(double.class) + numInt * sizeof(int.class);
上课铃就是安魂曲 2024-12-02 16:49:01

更好的解决方案可能是不模拟 C 语法,而是使用带有嵌套 ByteArrayOutputStream 的 ObjectOutputStream 来生成字节数组,然后将其写入 ByteBuffer。

A better solution might be to not emulate C syntax and use an ObjectOutputStream with a nested ByteArrayOutputStream to generate a byte array which can then be written to your ByteBuffer.

俯瞰星空 2024-12-02 16:49:01

Java 中的大小始终相同。您可以对其进行硬编码,但只需要这样做,因为您正在处理 ByteBuffer 中的字节。如果您使用double[]DoubleBuffer,则不需要这些。

The size in Java is always the same. You can hardcode it but you only need to do this because you are working with bytes in a ByteBuffer. If you use double[] or DoubleBuffer you don't need these.

姜生凉生 2024-12-02 16:49:01

您还可以使用 sizeof4j 库来获取您只需要的 double 的大小 SizeOf.doubleSize( )

You can also use the sizeof4j library to get the sizeof the double you just need SizeOf.doubleSize()

栀子花开つ 2024-12-02 16:49:01

自动化和抽象的解决方案是将样本写入 DataOutput 并查看结果的大小。

Automated and abstract solution is to write the sample to DataOutput and see the resulted size.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文