开发者

Four integers in four bytes?

开发者 https://www.devze.com 2023-02-06 15:52 出处:网络
I wonder if I could ask for some advice regarding some work I\'m currently doing. I am working from a STANAG document which quotes the following:

I wonder if I could ask for some advice regarding some work I'm currently doing.

I am working from a STANAG document which quotes the following:

ID numbers shall be formed as 4-byte numbers. The first (most significant) byte shall be the standard NATO country code for the object in question. Valid country codes shall range from 0 to 99 decimal... Country code 255 (hexadecimal FF) shall be reserved.

It then 开发者_JAVA技巧goes on to detail the three other bytes. In the specification, the ID is given the type Integer 4, where Integer n is a signed integer and n is 1,2, or 4 bytes.

My question, and I acknowledge this could be considered an ignorant question and I apologise, is that an integer is, as we know, 32 bits/4 bytes. How can "the first byte" be, for example, 99, when 99 is an integer?

I would greatly appreciate any clarification here.


An integer is normally 4 bytes. But if you store a small number like 99, the other three bytes store 8x 0-value bits. The spec is asking for you to use one integer storage (4-bytes) to store 4 different smaller numbers within its bytes.

The easiest way is probably to use a toInt function on an array of 4 bytes, e.g. (there is no byte[] length checking nor is this function tested - it is illustrative only)

public static final int toInt(byte[] b) 
{
    int l = 0;
    l |= b[0] & 0xFF;
    l <<= 8;
    l |= b[1] & 0xFF;
    l <<= 8;
    l |= b[2] & 0xFF;
    l <<= 8;
    l |= b[3] & 0xFF;
    return l;
}

byte[] bytes = new byte[] {99, 4, 9, 0};
int i = toInt(bytes, 0);

32-bits of an int

11110101   00000100   00001001   00000000
^byte      ^byte      ^byte      ^byte

Each block of 8 bits in the int is enough to "encode"/"store" a smaller number. So an int can be used to mash together 4 smaller numbers.


"99" is an integer number mathematically, but not necessarily an Integer or int from the Java perspective. The value 99 can be held by a short, for instance (which is short for "short integer"), which is a 16-bit data type, or in a byte, which is an 8-bit data type.

So basically, you'll want to look at their ID thing as a series of four byte values. Beware that Java's byte type is signed.


An integer (outside computing) just means any value without a decimal which includes 2, 99, -5, 34134, 427391471244211, etc. In computing terms, an integer is (traditionally) a 32-bit number that can contains any value that will fit in it. Each byte (8 bits) of that (computing) integer value is also an individual (numerical) integer between 0 and 255.

0

精彩评论

暂无评论...
验证码 换一张
取 消