我正在将NSDate
转换为Unix时间。问题是,我需要将其转换为小端,以便可以通过蓝牙发送;但我不知道如何将time_t
转换为小端。
到目前为止我有什么:
time_t t = [date timeIntervalSince1970];
NSMutableData * date = [[NSMutableData alloc] init];
[data appendBytes:&t length:sizeof(t)];
我得到了什么:
0x10603854 // Fri, 15 Sep 1978 21:02:12 GMT
我需要什么:
0x54386010 // Fri, 10 Oct 2014 22:39:12 GMT
答案 0 :(得分:1)
确保特定值的字节顺序的最简单方法是使用NSSwapHostXYZToLittle
或NSSwapHostXYZToBig
(其中XYZ
为类型)。有关这些功能的更多信息可以在at this Foundation Functions reference page找到。
我认为对于OS X和iOS,time_t
是long
,因此如果您想保证该值为little-endian,则需要使用NSSwapHostLongToLittle
。要转换回来,请使用NSSwapLittleLongToHost
。同样,如果您要转换为big-endian,则可以使用NSSwapHostLongToBig
并转换回来,您可以使用NSSwapBigLongToHost
。
如果您已经在little-endian架构上执行代码,这些函数将成为无操作。
time_t t = NSSwapHostLongToLittle([date timeIntervalSince1970]);
NSMutableData *date = [[NSMutableData alloc] init];
[data appendBytes:&t length:sizeof(t)];
答案 1 :(得分:0)
如果您通过蓝牙进行通信,那么可能是另一方的设备有一些固定的要求,例如“4字节,小端,自1970年以来的秒数”。您需要根据该设备编写代码。如果您的代码在64位系统上运行,那么time_t不太可能是32位数,但您正在与之通信的设备不知道并且仍然需要32位。
您应该查看存储小端数的方式,然后编写将正确顺序的四个字节放入NSData的代码。
答案 2 :(得分:-1)
不是最优雅的方式。
NSMutableData *time_ = [[NSMutableData alloc] init];
time_t t = [date timeIntervalSince1970];
[time_ appendBytes:&t length:4];
unsigned char *bytePtr = (unsigned char *)[time_ bytes];
NSString* _time = [NSString stringWithFormat:@"%02X%02X%02X%02X", bytePtr[3], bytePtr[2], bytePtr[1], bytePtr[0]];
for (i = 0; i < 4; i++)
{
if (_time.length > i*2)
{
byte_chars[0] = [_time characterAtIndex:i*2];
byte_chars[1] = [_time characterAtIndex:i*2+1];
whole_byte = strtol(byte_chars, NULL, 16);
[data appendBytes:&whole_byte length:1];
}
}
NSLog(@"_time_data %@", _time);
2014-10-13 16:54:59.766 wrightscs [20810:2929687] _time_data&lt; 543c4a31&gt;
十六进制时间:543c4a31
GMT:星期一,2014年10月13日21:54:57 GMT
您的时区:2014年10月13日下午4:54:57 CDT
十进制时间戳/纪元:1413237297