在C中将大端点转换为小端点[不使用提供的函数]

在C中将大端点转换为小端点[不使用提供的函数]

在C中,我需要编写一个函数来将大端点转换为小端点。我不能使用任何库函数。



德玛西亚99
浏览 700回答 3
3回答

慕哥9229398

假设您需要的是一个简单的字节交换,请尝试如下无符号16位转换:swapped&nbsp;=&nbsp;(num>>8)&nbsp;|&nbsp;(num<<8);无符号32位转换:swapped&nbsp;=&nbsp;((num>>24)&0xff)&nbsp;|&nbsp;//&nbsp;move&nbsp;byte&nbsp;3&nbsp;to&nbsp;byte&nbsp;0 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((num<<8)&0xff0000)&nbsp;|&nbsp;//&nbsp;move&nbsp;byte&nbsp;1&nbsp;to&nbsp;byte&nbsp;2 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((num>>8)&0xff00)&nbsp;|&nbsp;//&nbsp;move&nbsp;byte&nbsp;2&nbsp;to&nbsp;byte&nbsp;1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((num<<24)&0xff000000);&nbsp;//&nbsp;byte&nbsp;0&nbsp;to&nbsp;byte&nbsp;3这将字节顺序从位置1234转换为4321。如果你的输入是0xdeadbeef,则32位Endian交换可能具有0xefbeadde.上面的代码应该用宏或者至少用常量来清除,而不是神奇的数字,但是希望它能起到作用。编辑:正如另一个答案所指出的,有平台、操作系统和指令集的特定选项,它们比上面的要快得多。在Linux内核中,有一些宏(例如cpu_to_be 32),它们很好地处理了endianness。但这些替代物是特定于它们的环境的。在实践中,最好使用多种可用的方法来处理Endianness问题。

慕尼黑8549860

包括:#include&nbsp;<byteswap.h>您可以获得与机器相关的字节交换函数的优化版本。然后,您可以轻松地使用以下功能:__bswap_32&nbsp;(uint32_t&nbsp;input)或__bswap_16&nbsp;(uint16_t&nbsp;input)

守着一只汪

#include&nbsp;<stdint.h>//!&nbsp;Byte&nbsp;swap&nbsp;unsigned&nbsp;shortuint16_t&nbsp;swap_uint16(&nbsp;uint16_t&nbsp;val&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(val&nbsp;<<&nbsp;8)&nbsp;|&nbsp;(val&nbsp;>>&nbsp;8&nbsp;);}//!&nbsp;Byte&nbsp;swap&nbsp;shortint16_t&nbsp;swap_int16(&nbsp;int16_t&nbsp;val&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(val&nbsp;<<&nbsp;8)&nbsp;|&nbsp;((val&nbsp;>>&nbsp;8)&nbsp;&&nbsp;0xFF);}//!&nbsp;Byte&nbsp;swap&nbsp;unsigned&nbsp;intuint32_t&nbsp;swap_uint32(&nbsp;uint32_t&nbsp;val&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;=&nbsp;((val&nbsp;<<&nbsp;8)&nbsp;&&nbsp;0xFF00FF00&nbsp;)&nbsp;|&nbsp;((val&nbsp;>>&nbsp;8)&nbsp;&&nbsp;0xFF00FF&nbsp;);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(val&nbsp;<<&nbsp;16)&nbsp;|&nbsp;(val&nbsp;>>&nbsp;16);}//!&nbsp;Byte&nbsp;swap&nbsp;intint32_t&nbsp;swap_int32(&nbsp;int32_t&nbsp;val&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;=&nbsp;((val&nbsp;<<&nbsp;8)&nbsp;&&nbsp;0xFF00FF00)&nbsp;|&nbsp;((val&nbsp;>>&nbsp;8)&nbsp;&&nbsp;0xFF00FF&nbsp;);&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(val&nbsp;<<&nbsp;16)&nbsp;|&nbsp;((val&nbsp;>>&nbsp;16)&nbsp;&&nbsp;0xFFFF);}更新增加了64位字节交换int64_t&nbsp;swap_int64(&nbsp;int64_t&nbsp;val&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;=&nbsp;((val&nbsp;<<&nbsp;8)&nbsp;&&nbsp;0xFF00FF00FF00FF00ULL&nbsp;)&nbsp;|&nbsp;((val&nbsp;>>&nbsp;8)&nbsp;&&nbsp;0x00FF00FF00FF00FFULL&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;=&nbsp;((val&nbsp;<<&nbsp;16)&nbsp;&&nbsp;0xFFFF0000FFFF0000ULL&nbsp;)&nbsp;|&nbsp;((val&nbsp;>>&nbsp;16)&nbsp;&&nbsp;0x0000FFFF0000FFFFULL&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(val&nbsp;<<&nbsp;32)&nbsp;|&nbsp;((val&nbsp;>>&nbsp;32)&nbsp;&&nbsp;0xFFFFFFFFULL);}uint64_t&nbsp;swap_uint64(&nbsp;uint64_t&nbsp;val&nbsp;){ &nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;=&nbsp;((val&nbsp;<<&nbsp;8)&nbsp;&&nbsp;0xFF00FF00FF00FF00ULL&nbsp;)&nbsp;|&nbsp;((val&nbsp;>>&nbsp;8)&nbsp;&&nbsp;0x00FF00FF00FF00FFULL&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;=&nbsp;((val&nbsp;<<&nbsp;16)&nbsp;&&nbsp;0xFFFF0000FFFF0000ULL&nbsp;)&nbsp;|&nbsp;((val&nbsp;>>&nbsp;16)&nbsp;&&nbsp;0x0000FFFF0000FFFFULL&nbsp;); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(val&nbsp;<<&nbsp;32)&nbsp;|&nbsp;(val&nbsp;>>&nbsp;32);}
打开App,查看更多内容
随时随地看视频慕课网APP