将坐标编码为二进制并压缩

Encoding coordinates to binary and compression

我一直在研究如何将 24.801044 120.993085 等坐标编码为二进制,以便我可以通过 phone 发送二进制消息,然后在另一个上对其进行解码。问题是,如果我一个符号一个符号地做,那么我需要将近 80 位。我还考虑过对完整的字符串进行编码,然后在发送后将其剪切。

如何更好地实施?

如果float精度对你来说足够了,你可以使用floatToRawIntBits将两个数字打包成64位长值:

float x = 24.801044f;
float y = 120.993085f;
System.out.println("Input: "+x+"; "+y);
// Encode
long data = (((long)Float.floatToRawIntBits(x)) << 32) | Float.floatToRawIntBits(y);
// Now send the data to another phone
// Decode
float resX = Float.intBitsToFloat((int)(data >>> 32));
float resY = Float.intBitsToFloat((int)data);
System.out.println("Result: "+resX+"; "+resY);

输出:

Input: 24.801044; 120.99309
Result: 24.801044; 120.99309

或者,如果您事先知道您的坐标不超过某个值(如 360),您可以重新规范化数字:

double x = 24.801044;
double y = 120.993085;
System.out.println("Input: "+x+"; "+y);
// Encode
long data = (Math.round(x * 1e6) << 32) | Math.round(y * 1e6);
// Now send the data to another phone
// Decode
double resX = (data >>> 32)/1e6;
double resY = ((int)data)/1e6;
System.out.println("Input: "+resX+"; "+resY);

输出:

Input: 24.801044; 120.993085
Result: 24.801044; 120.993085

这样你会得到更好的精度