我正在将数据从iPhone传输到从设备,其中传输需要16位数据值。现在,我有一个需要转换的浮点值,但是我如何知道它的大小以及如何用十六进制表示呢?
需要十六进制表示,因为我可能需要切换上下半字节。
最佳答案
如果您想了解详细信息,请在网上查找IEEE floating-point standard。但是要以十六进制表示,只需生成数字,获取各个字节,然后生成其十六进制表示。您需要知道的两件事是值的长度(例如sizeof(double)
)以及它是存储在“big-endian”还是“little-endian”中。 iOS设备始终为“little-endian”,这意味着该值的最低有效字节具有最低的内存地址。
获得字节的直接方法是创建一个union
或float
的C double
和一个适当长度的unsigned char
数组。将浮点值存储到联合中,然后检索unsigned char
字节以转换为十六进制。您还可以使用适当的指针类型的类型转换来执行此“别名”。
union {
float f;
double d;
unsigned char c[8];
} foo;
foo.d = 3.14156;
for(int i=0;i<8;i++) printf("%02X",foo.c[i]);
对于Java用户,不能使用并集和别名的情况下,在Float和Double上有以下类方法:
Float.floatToRawIntBits(floatValue)
Double.doubleToRawLongBits(doubleValue)
和它们的逆
Float.intBitsToDouble(intValue)
Double.longBitsToDouble(longValue)
请注意,它们不会进行类转换(例如,4.1 float将不会转换为4 int),而是将不变的位模式从float转换为整数格式。
关于ios - float 如何用十六进制表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11950343/