C++ 如何将二进制IPv6地址转换为十六进制
我收到一个128位的二进制地址,我需要把它转换成十六进制格式。这就是我要做的:C++ 如何将二进制IPv6地址转换为十六进制,c++,binary,hex,type-conversion,ipv6,C++,Binary,Hex,Type Conversion,Ipv6,我收到一个128位的二进制地址,我需要把它转换成十六进制格式。这就是我要做的: 我将收到128位二进制数 我需要把它分成8个块,每个块16位,所以我将有8个变量,每个都有16位 00100001110100000000 11010011 0000000000000000 00101111100111011 000000 1010101010 00000000 11111111 0000000000000000000000000000 现在,我需要将这16位进一步分成4位,每一位都是一个半字节
- 我将收到128位二进制数
- 我需要把它分成8个块,每个块16位,所以我将有8个变量,每个都有16位 00100001110100000000 11010011 0000000000000000 00101111100111011 000000 1010101010 00000000 11111111 0000000000000000000000000000
- 现在,我需要将这16位进一步分成4位,每一位都是一个半字节
0010 0001 1101 1010
0000 0000 1101 0011
0000 - 现在我将为每个变量得到四个子变量
- 每个变量的长度为16位,子变量的长度为4位
- 然后,我需要将这些子变量转换成十六进制 0010 0001 1101 1010 21天A
- 组合所有子变量并以十六进制形式形成IPv6地址: 21DA:00D3:0000:2F3B:02AA:00FF:0000:0000
<有谁能告诉我如何在C++中使用?< p>可以使用SpRAPF和Frand说明符X来打印十六进制的整数值。每个块不需要分割超过4个字节。所以如果你有这个:
string a = "00100001110110100000000011010011";
unsigned value = 0;
for (int i = 0;i < a.size();++i) {
value = value * 2 + a[i] - '0';
}
printf("%04X\n", value);
string a=“0010000111010000000001010011”;
无符号值=0;
对于(int i=0;i
这将解决你大部分的问题。我已经使用上面的printf在stdout上演示了输出。您可以使用sprintf和格式说明符X将整数值打印为十六进制。每个块不需要分割超过4个字节。所以如果你有这个:
string a = "00100001110110100000000011010011";
unsigned value = 0;
for (int i = 0;i < a.size();++i) {
value = value * 2 + a[i] - '0';
}
printf("%04X\n", value);
string a=“0010000111010000000001010011”;
无符号值=0;
对于(int i=0;i
这将解决你大部分的问题。我已经使用上面的printf在stdout上演示了输出。要获得16位值中的四个最高位,请将其右移12位。这将导致顶部位为零,因此不需要掩蔽。对于其他的,您可以(可选)右移,并使用按位and运算符
&
屏蔽掉最低的四位
要将从上述步骤获得的值转换为字符形式的十六进制数字,则对于小于10的值,添加'0'
(如果您使用的是ASCII编码的计算机),对于大于等于10的值,则减去10,然后添加,例如'a'
当然还有更简单的方法,比如使用例如
sprintf
直接转换数字。只需将16位的值转换为无符号的short,然后执行以下操作:
printf("%04hx\n", value_as_unsigned_short);
假设您有二进制数
000100010101011
。这是十六进制表示法12ab
如果二进制数是一个整数变量,比如一个名为value
的变量,我们可以将十六进制表示为如下字符串:
// First get each digit, one by one
digit0 = value & 0x0f; // Mask out everything but the lowest four bits
digit1 = (value >> 4) 0x0f;
digit2 = (value >> 8) 0x0f;
digit3 = value >> 12;
// Now make a string out of those four digits
char str[5]; // Four digits plus the string terminator
// If a digit is less than 10, then add '0' to get an ASCII character
// Else decrease by ten (to get a number between 0 and 5) and add 'A'
str[0] = digit3 < 10 ? digit3 + '0' : (digit3 - 10) + 'A';
str[1] = digit2 < 10 ? digit2 + '0' : (digit2 - 10) + 'A';
str[2] = digit1 < 10 ? digit1 + '0' : (digit1 - 10) + 'A';
str[3] = digit0 < 10 ? digit0 + '0' : (digit0 - 10) + 'A';
str[4] = '\0'; // Terminate string
printf("value is in hex %s\n", str);
上面两段代码的结果将完全相同
关于您的编辑:
std::ostringstream oss;
for (size_t i = 0; i < 8; ++i, aBinaryIPAddress += 2)
{
// Take the first byte, and shift it left 8 bits, making it
// the high byte of a 16-bit number. Then or (or add) the next
// byte at the low 8 bits in the 16-bit number.
// The casting is needed because we're working with 16-bit numbers
// and not bytes.
uint16_t value = static_cast<uint16_t>(*aBinaryIPAddress << 8) |
static_cast<uint16_t>(*(aBinaryIPAddress + 1));
oss << std::setfill('0') << std::setw(4) << std::hex << value;
if (i < 7)
oss << ':';
}
std::cout << "Address is " << oss.str() << '\n';
std::ostringstream oss;
对于(大小i=0;i<8;++i,aBinaryIPAddress+=2)
{
//取第一个字节,将其左移8位,使其
//16位数字的高位字节。然后是或(或加)下一个
//16位数字中低8位的字节。
//因为我们使用的是16位数字,所以需要进行转换
//而不是字节。
uint16_t value=static_cast(*aBinaryIPAddress要获得16位值的四个最高位,您将其右移12位。这将导致顶部位为零,因此无需屏蔽。对于其他位,您(可选)右移并使用按位and运算符&
屏蔽四个最低位
要将从上述步骤获得的值转换为字符形式的十六进制数字,则对于小于10的值,添加'0'
(如果您使用的是ASCII编码的计算机),对于大于等于10的值,则减去10,然后添加,例如'a'
当然还有更简单的方法,比如使用sprintf直接转换数字
printf("%04hx\n", value_as_unsigned_short);
假设您有二进制数000100101101011
。这是十六进制表示法12ab
如果二进制数是一个整数变量,比如一个名为value
的变量,我们可以将十六进制表示为如下字符串:
// First get each digit, one by one
digit0 = value & 0x0f; // Mask out everything but the lowest four bits
digit1 = (value >> 4) 0x0f;
digit2 = (value >> 8) 0x0f;
digit3 = value >> 12;
// Now make a string out of those four digits
char str[5]; // Four digits plus the string terminator
// If a digit is less than 10, then add '0' to get an ASCII character
// Else decrease by ten (to get a number between 0 and 5) and add 'A'
str[0] = digit3 < 10 ? digit3 + '0' : (digit3 - 10) + 'A';
str[1] = digit2 < 10 ? digit2 + '0' : (digit2 - 10) + 'A';
str[2] = digit1 < 10 ? digit1 + '0' : (digit1 - 10) + 'A';
str[3] = digit0 < 10 ? digit0 + '0' : (digit0 - 10) + 'A';
str[4] = '\0'; // Terminate string
printf("value is in hex %s\n", str);
上面两段代码的结果将完全相同
关于您的编辑:
std::ostringstream oss;
for (size_t i = 0; i < 8; ++i, aBinaryIPAddress += 2)
{
// Take the first byte, and shift it left 8 bits, making it
// the high byte of a 16-bit number. Then or (or add) the next
// byte at the low 8 bits in the 16-bit number.
// The casting is needed because we're working with 16-bit numbers
// and not bytes.
uint16_t value = static_cast<uint16_t>(*aBinaryIPAddress << 8) |
static_cast<uint16_t>(*(aBinaryIPAddress + 1));
oss << std::setfill('0') << std::setw(4) << std::hex << value;
if (i < 7)
oss << ':';
}
std::cout << "Address is " << oss.str() << '\n';
std::ostringstream oss;
对于(大小i=0;i<8;++i,aBinaryIPAddress+=2)
{
//取第一个字节,将其左移8位,使其
//16位数字的高位字节。然后是或(或加)下一个
//16位数字中低8位的字节。
//因为我们使用的是16位数字,所以需要进行转换
//而不是字节。
uint16\u t value=static\u cast(*aBinaryIPAddress)那么对你不起作用?你知道算法,它很简单;试着为它编写一个代码。如果你在实现这个算法时遇到困难,可以问这个问题code@Barun我不知道如何从一个16位二进制文件中提取一个半字节,如果你想自己去做的话(而不是使用已经可以做到这一点的函数)然后阅读有关按位运算的内容,如按位and(&
运算符)和shift(按位移位)
运算符)@JoachimPileborg我们的库不支持使用inet_ntop函数,任何其他建议都不适用于你?你知道算法,它很简单;试着为它编写代码。如果你在实现code@Barun如果你想自己做的话,我不知道如何从16位二进制文件中提取一个小字节(取而代之的是o