再次将float []转换为byte []以浮动[]

时间:2012-02-19 04:36:29

标签: java arrays floating-point byte

所以我在这里尝试做的是获取float[],将其转换为byte[],通过网络将其作为数据报包发送,然后将其转换回byte[]在接收终端。

现在我知道我可以使用float[]方法将byte[]转换为getBytes[]。但我不知道如何扭转转换。

8 个答案:

答案 0 :(得分:9)

我认为您希望使用ByteBuffer类,其中包含putFloatgetFloat方法。

答案 1 :(得分:5)

另一种方法......使用ByteArrayOutputStream / DataOutputStream进行输出

float fArr[] = ...;
ByteArrayOutputStream bas = new ByteArrayOutputStream();
DataOutputStream ds = new DataOutputStream(bas);
for (float f : fArr) 
    ds.writeFloat(f);
byte[] bytes = bas.toByteArray();

使用ByteArrayInputStream / DataInputStream进行输入

byte[] buffer = ...;
ByteArrayInputStream bas = new ByteArrayInputStream(buffer);
DataInputStream ds = new DataInputStream(bas);
float[] fArr = new float[buffer.length / 4];  // 4 bytes per float
for (int i = 0; i < fArr.length; i++)
{
    fArr[i] = ds.readFloat();
}

答案 2 :(得分:2)

使用Float.floatToIntBits()将float的位值提取为整数,然后使用BigInteger.toByteArray()生成byte[]。这可以使用BigInteger构造函数反转,该构造函数采用byte[]参数,然后Float.intBitsToFloat()

答案 3 :(得分:1)

这是我以后参考的重点。

public static byte[] floatToByte(float[] input) {
    byte[] ret = new byte[input.length*4];
    for (int x = 0; x < input.length; x++) {
        ByteBuffer.wrap(ret, x*4, 4).putFloat(input[x]);
    }
    return ret;
}

public static float[] byteToFloat(byte[] input) {
    float[] ret = new float[input.length/4];
    for (int x = 0; x < input.length; x+=4) {
        ret[x/4] = ByteBuffer.wrap(input, x, 4).getFloat();
    }
    return ret;
}

可以简化为https://stackoverflow.com/a/44104399/322017之类的单行。

答案 4 :(得分:0)

<强>发件人

ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
// byteBuffer reused for every element in floatArray
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
// go through the elements in the float array writing its
// byte equivalent  to the stream
for(float element : floatArray) {
  byteBuffer.clear();
  byteBuffer.putFloat(element)
  byteStream.write(byteBuffer.array());
}

// Logic for sending bytestream's bytes as datagram packet
// can get byte[] from steam by: byteStream.toByteArray();

<强>接收机

ArrayList<Float> receivedValues = new ArrayList<Float>();
ByteBuffer byteBuffer = ByteBuffer.wrap(receivedBytes);

// while there is still 4 bytes left on the byte buffer
// grab the next float and add it to the received list
int position = 0;
while(byteBuffer.capactiy - position >= 4) {
  receivedValues.add(byteBuffer.getFloat(position));
  position += 4;
}

float[] result = new float[receivedValues.count];
return receivedValues.toArray(new float[receivedValues.size()]);

答案 5 :(得分:0)

您需要在ByteBuffer的FloatBuffer中使用getFloat()和putFloat()命令。事实上,你应该这样做只是因为速度快。理解字节操作是一件好事。您还可以混合和匹配数据,并根据需要放置和获取数据。所有这些都由字节缓冲区支持。所以发送数组的常见情况是,你也需要发送数组的大小。

public static void writeFloatArray(float[] array, OutputStream stream) throws IOException {
    ByteBuffer buffer = ByteBuffer.allocate(4 * (array.length + 1)).putInt(array.length);
    buffer.asFloatBuffer().put(array,0,array.length);
    stream.write(buffer.array());
}

您只需确保分配足够的字节来存储缓冲区中的所有内容。写一些东西,写一些其他的东西等。理解这一点使事情变得更容易。另一方面,我们基本上做同样的事情,虽然我们需要额外的读取,因为我们不知道数组有多大,只是有一个:

public static float[] readFloatArray(InputStream in) throws IOException {
    byte[] data = new byte[4];
    if (readFully(in, data) != data.length) return null;
    int length = ByteBuffer.wrap(data).getInt();
    data = new byte[length * 4];
    if (readFully(in,data) != data.length) return null;
    float[] array = new float[length];
    ByteBuffer.wrap(data).asFloatBuffer().get(array,0,array.length);
    return array;
}

完整的功能,虽然不完全是其中的一部分:

public static int readFully(InputStream in, byte[] data) throws IOException {
    int offset = 0;
    int bytesRead;
    boolean read = false;
    while ((bytesRead = in.read(data, offset, data.length - offset)) != -1) {
        read = true;
        offset += bytesRead;
        if (offset >= data.length) {
            break;
        }
    }
    return (read) ? offset : -1;
}

答案 6 :(得分:0)

ByteBuffer文档:https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html

import win32com.client
app = win32com.client.gencache.EnsureDispatch('Excel.Application')

答案 7 :(得分:-1)