将MAC地址解析为三个16位短路的数组
MAC地址是48位。这相当于三条短裤。雨衣 地址有时是这样写的:将MAC地址解析为三个16位短路的数组,c,string-parsing,short,bit-packing,C,String Parsing,Short,Bit Packing,MAC地址是48位。这相当于三条短裤。雨衣 地址有时是这样写的:01:23:45:67:89:abwhere 每对数字代表一个十六进制数 编写一个函数,该函数将接收指向 null终止的字符串,如示例中所示,将 将其拆开,然后将其储存在三条16位短裤的阵列中。 数组的地址也将被传递到函数中 我认为函数头应该类似于void convertmathort(char*macAddr,short*short)。我遇到的困难是解析char*。我觉得如果我把它绕过去是可能的,但那感觉不够有效。我甚至不需要将其
01:23:45:67:89:ab
where
每对数字代表一个十六进制数
编写一个函数,该函数将接收指向
null
终止的字符串,如示例中所示,将
将其拆开,然后将其储存在三条16位短裤的阵列中。
数组的地址也将被传递到函数中
我认为函数头应该类似于void convertmathort(char*macAddr,short*short)代码>。我遇到的困难是解析char*
。我觉得如果我把它绕过去是可能的,但那感觉不够有效。我甚至不需要将其作为一种通用函数——MAC地址将始终是一个char*
,格式为01:23:45:67:89:ab
解析这个的好方法是什么?效率是一回事。。。健壮性是另一个
如果您有非常明确的情况,比如数百万个MAC地址的列表,它们都是相同的格式(只有小写字母,总是前导零,…),那么我建议使用快速函数直接访问字符
如果您正在解析用户输入,并且还需要检测输入错误,那么执行速度就不必担心了。在这种情况下,您必须确保检测到用户能够犯的所有可能的错误(这是一项了不起的壮举)。这导致了sscanf(..)
,在这种情况下,我甚至建议您编写自己的函数来解析字符串(根据我的经验sscanf(..)
有时会根据输入字符串产生问题,因此我在处理用户输入时避免使用它)
另一件事:如果您担心执行时间的效率,请编写一个小基准测试,它可以运行数百万次解析函数并比较执行时间。这很容易做到,有时会带来惊喜……你说这不够高效是什么意思?您需要至少读取每个字符一次;但对于效率最大值,您最多应该阅读一次。我不知道你在担心什么。我想我的意思是我不觉得我应该绕过去。既然我们知道地址是什么,我们就可以手动访问char*
中的每个点。哦,是的,这会起作用,而且可能是您应该做的。由于MAC地址有固定的格式,您可以使用单个sscanf
解析字符串,例如sscanf(%x:%x:%x:%x:%x:%x:%x”、&temp[0]、&temp[1],…
。然后只需将temp
条目组合到short
s中即可。您可以通过创建一个函数来分解它,该函数接受一个字符*并返回一个short。然后将其中三个部分馈送给它:“xx:xx”。