Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将时间转换为小端点?_Objective C_Endianness - Fatal编程技术网

Objective c 将时间转换为小端点?

Objective c 将时间转换为小端点?,objective-c,endianness,Objective C,Endianness,我正在将NSDate转换为Unix时间。问题是,我需要将其转换为little endian,以便通过蓝牙发送;但我不知道如何将时间转换为小端点 到目前为止,我所拥有的: 我得到的是: 我需要的是: 如果你是通过蓝牙进行通信,那么另一边可能有一个设备有一些固定的要求,比如4字节,小端,自1970年以来的秒数。您需要根据该设备编写代码。如果您的代码在64位系统上运行,则时间不太可能是32位数字,但与您交谈的设备不知道这一点,并且仍然需要32位 您应该查找endian数字的存储量,然后编写代码,将四个

我正在将NSDate转换为Unix时间。问题是,我需要将其转换为little 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)];