如何从s64值中删除前3个字节和最后一个字节?

时间:2014-05-12 12:42:44

标签: c++ c linux types casting

代码:

s64 end_time;
struct timespec ts;
getrawmonotonic(&ts);
end_time = timespec_to_ns(&ts);

如何从end_time中删除前三个字节并从中删除最后一个字节? 我想将它存储在uint32中。 谁能告诉我怎么做?

uint32 latency;
fscanf(fp, "%lu\n", latency);  //fp  is reading the end_time and storing in latency.
latency = (uint32) (latency >> 8) & 0xFFFFFFFF;

3 个答案:

答案 0 :(得分:1)

怎么样:

u32 end_time32 = (u32) (end_time >> 24) & 0xFFFFFFFF;

根据您对firstlast字节的定义,它也可以是:

u32 end_time32 = (u32) (end_time >> 8) & 0xFFFFFFFF;

示例:

s64 end_time = 0x1234567890ABCDEF;
u32 end_time32 = (u32) (end_time >> 24) & 0xFFFFFFFF;

// end_time32 is now: 0x34567890

s64 end_time = 0x1234567890ABCDEF;
u32 end_time32 = (u32) (end_time >> 8) & 0xFFFFFFFF;

// end_time32 is now: 0x7890ABCD

修改

更新后的问题:

s64 latency;
fscanf(fp, "%lld", latency);  //fp  is reading the end_time and storing in latency.
u32 latency32 = (uint32) (latency >> 8) & 0xFFFFFFFF;

答案 1 :(得分:1)

我假设第一次"和"最后"你的意思是"最重要的"和"最不重要的"分别。

即,你有8个字节:

76543210

并希望将其映射到4个字节:

4321

最简单的方法是使用shift,mask和(截断)强制转换:

const uint32_t time32 = (uint32_t) ((end_time >> 8) & 0xffffffff);

编辑器很可能会对掩码进行优化,但很清楚它是什么。

答案 2 :(得分:0)

你可以用位移来做到这一点。您必须将值8位(= 1个字节)向右移动,这是通过>>运算符完成的:

uint32_t t = (uint32_t)(end_time >> 8);
//                               ^^
//                          bit-shifting

在下文中,可视化字节以便更好地理解。如果值end_time由带有符号值A B C D E F G H的八个字节组成,则您需要的是D E F G

end_time:                     A B C D E F G H
end_time >> 8:                0 A B C D E F G
(uint32_t)(end_time >> 8):            D E F G