Objective c 将时间转换为小端点?
我正在将NSDate转换为Unix时间。问题是,我需要将其转换为little endian,以便通过蓝牙发送;但我不知道如何将时间转换为小端点 到目前为止,我所拥有的: 我得到的是: 我需要的是:Objective c 将时间转换为小端点?,objective-c,endianness,Objective C,Endianness,我正在将NSDate转换为Unix时间。问题是,我需要将其转换为little endian,以便通过蓝牙发送;但我不知道如何将时间转换为小端点 到目前为止,我所拥有的: 我得到的是: 我需要的是: 如果你是通过蓝牙进行通信,那么另一边可能有一个设备有一些固定的要求,比如4字节,小端,自1970年以来的秒数。您需要根据该设备编写代码。如果您的代码在64位系统上运行,则时间不太可能是32位数字,但与您交谈的设备不知道这一点,并且仍然需要32位 您应该查找endian数字的存储量,然后编写代码,将四个
如果你是通过蓝牙进行通信,那么另一边可能有一个设备有一些固定的要求,比如4字节,小端,自1970年以来的秒数。您需要根据该设备编写代码。如果您的代码在64位系统上运行,则时间不太可能是32位数字,但与您交谈的设备不知道这一点,并且仍然需要32位
您应该查找endian数字的存储量,然后编写代码,将四个字节按正确的顺序放入NSData 不是最优雅的方式
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]时间数据
转换的时间戳:
十六进制时间:543c4a31
格林尼治时间:2014年10月13日星期一21:54:57格林尼治时间
您的时区:2014年10月13日CDT下午4:54:57
十进制时间戳/历元:1413237297
确保特定值的结束性的最简单方法是使用NSSwapHostXYZToLittle或NSSwapHostXYZToBig,其中XYZ是类型。有关这些函数的更多信息,请参见 我认为对于OSX和iOS,时间是很长的,所以如果您想保证值是little endian,那么您需要使用NSSwapHostLongToLittle。要转换回,请使用NSSwapLittleLongToHost。类似地,如果要转换为big-endian,可以使用NSSwapHostLongToBig,要转换回big-endian,可以使用nsswapbigtlongtobost 如果您已经在little-endian体系结构上执行代码,那么这些函数将成为无操作
time_t t = NSSwapHostLongToLittle([date timeIntervalSince1970]);
NSMutableData *date = [[NSMutableData alloc] init];
[data appendBytes:&t length:sizeof(t)];
这不是一个简单的C问题吗?在我看来你已经有了little-endian。这更干净了,事实上,我的问题倒过来了,应该是大的,所以NSSwapHostLongToBig会为我返回正确的格式。在iOS和Mac OS X上,time_t是一个int64_t,在64位平台上是长的,在32位平台上是长的。@CuriousRabbit:我不确定这是真的,使用-arch i386编译时打印SizeOffTime_t会给出4,而不是8,表示它可能仍然是长的,或者可能只是int。是的,我错了。两者都有很长的路要走。即,32位体系结构上的32位和64位体系结构上的64位。谢谢你的更正。我不确定我的错误假设是从哪里来的,但我不会忘记。虽然这种方法对我有效,我会继续使用,@dreamlax的答案更干净。
0x54386010 // Fri, 10 Oct 2014 22:39:12 GMT
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);
time_t t = NSSwapHostLongToLittle([date timeIntervalSince1970]);
NSMutableData *date = [[NSMutableData alloc] init];
[data appendBytes:&t length:sizeof(t)];