2017-08-09 296 views
1

具有某些用户输入的QString包含MAC地址,例如"68F542F9AB22"。我需要将QString转换为数字的无符号字符数组[6],而不是ASCII表示。所以对于QString 68F542F9AB22在第一个位置无符号的字符数组应该是104十六进制QString表示为无符号字符数组

+0

是分离2再见2并插入到数组是好还是? – aghilpro

+0

你的意思是使用QString :: at(int position)来获取QChar,然后尝试将其转换为int并插入到数组中?我正在寻找一个更简单的方法。 – MABC

+0

@MABC这样的事情。为什么你需要这样的MAC?也许你有另一种解决方案。 – aghilpro

回答

2

你可以遍历您的QString,它切成两片,然后使用QString :: toUShort(& OK,16),它会给你你的十六进制字符串的ushort。

成才像

for(int i=0;i<6;++i) 
{ 
    QString hexString = yourstring.mid(i*2,2); 
    bool ok = false; 
    yourBuf[i] = (unsigned char) hexString.toUShort(&ok,16); 
    //if not ok, handle error 
} 

您务必做好一些检查您输入的字符串的正确长度,并做一些错误处理上转换错误。

希望这可能会帮助你。

+0

谢谢!是的,我检查QString首先是一个有效的十六进制字符串。 – MABC

+0

或者将'toULongLong'转换一次,忽略前16位,因为它们为零。 – MSalters

1

我会做以下列方式:

QString s("68F542F9AB22"); 
assert(s.size() % 2 == 0); 

std::vector<unsigned char> array; 
for (int i = 0; i < s.size(); i += 2) 
{ 
    QString num = s.mid(i, 2); 
    bool ok = false; 
    array.push_back(num.toUInt(&ok, 16)); 
    assert(ok); 
} 
+0

谢谢!它也可以工作 – MABC

0

你可以试试:

QString s = "68F542F9AB22"; 
unsigned char array[6]; 

if (s.length() % 2 == 0) { // test string length is even 
    for (unsigned long i = 0 ; i < s.length() ; i += 2) { 
     QString chunk = s.mid(i,2); 
     bool ok; 
     array[i/2] = static_cast<unsigned char>(chunk.toInt(&ok,16)); 
    } 
} 

注意的是,上面的代码仅适用于甚至字符串(但对于MAC地址,它的确定) 。

,并测试你可以使用结果:

for (unsigned long i = 0 ; i < 6 ; i ++) { 
    std::cout<<"Array ["<<i<<"] = "<<static_cast<unsigned long>(array[i])<<std::endl; 
} 
0

十六进制long long是一个单一的操作,将转换多达64位。这对于48位MAC来说已经足够了。所以:

bool ok = false; 
auto result = input.toULongLong(&ok,16); 
for(int i=5;i>=0;--i) 
{ 
    buf[i] = result & 0xFF; 
    result >>= 8; 
} 
+0

只适用于长64位的机器是64位吗? – MABC

+0

@MABC:最少64位。在一个64位的机器上,你可能会发现'long'是64位,'long long'可能是128位。此代码只依赖最小尺寸,而不是确切尺寸。 – MSalters

相关问题