将坐标编码为二进制并压缩
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
这样你会得到更好的精度
我一直在研究如何将 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
这样你会得到更好的精度