将MAC地址解析为三个16位短路的数组

将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*。我觉得如果我把它绕过去是可能的,但那感觉不够有效。我甚至不需要将其

MAC地址是48位。这相当于三条短裤。雨衣 地址有时是这样写的:
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”。