Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将二进制IPv6地址转换为十六进制_C++_Binary_Hex_Type Conversion_Ipv6 - Fatal编程技术网

C++ 如何将二进制IPv6地址转换为十六进制

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位的二进制地址,我需要把它转换成十六进制格式。这就是我要做的:

  • 我将收到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