代码:
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;
答案 0 :(得分:1)
怎么样:
u32 end_time32 = (u32) (end_time >> 24) & 0xFFFFFFFF;
根据您对first
和last
字节的定义,它也可以是:
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