如何使用C ++中的无序半字节构造十六进制格式的字节

时间:2018-05-24 14:43:48

标签: c++

我从以下字符串中得到如下数字序列:

std::string mcc_mnc = "514328";

该字符串由MCC(移动国家代码),MNC(移动网络代码)组成。字符串总是6个字符长,当MNC小于100时,它前面加0。

我需要构造3个十六进制字节,如下所示:

|  <---     8 bits       -->    |
| 4 bits        | 4 bits        |
| ------------- |:-------------:|
| 1             | 5             |
| 8             | 4             |
| 2             | 3             |

每一行都应该是一个十六进制数,使用C ++ std库(pre C ++ 11):

 00010101 (15)
 10000100 (84)
 00100011 (23)

根据User-Location-Info 3GPP标准的ECGI字段对其进行编码。有关格式,请参见屏幕截图。

enter image description here

1 个答案:

答案 0 :(得分:1)

我想你可能想要这些内容:

typedef unsigned char byte;

std::string mcc_mnc = "514328";

byte ecgi[3];

ecgi[0] = byte(mcc_mnc[0] - '0');
ecgi[0] = ecgi[0] | byte((mcc_mnc[1] - '0') << 4);

ecgi[1] = byte(mcc_mnc[2] - '0');
ecgi[1] = ecgi[1] | byte((mcc_mnc[5] - '0') << 4);

ecgi[2] = byte(mcc_mnc[3] - '0');
ecgi[2] = ecgi[2] | byte((mcc_mnc[4] - '0') << 4);

std::cout << std::hex << int(ecgi[0]) << '\n';
std::cout << std::hex << int(ecgi[1]) << '\n';
std::cout << std::hex << int(ecgi[2]) << '\n';

ASCII中减去'0'数字值(在字符串中),使其数值存储在给定的半字节中。

<强>输出:

15
84
23