来自int号的Hex * char

时间:2015-02-09 14:30:56

标签: c++ hex bit-shift

我在这里问如何将4个字符转换为int数字:stackoverflow link

它正在运作,但现在我需要做同样的事情,但反之亦然。我想从一个int中创建4个字符。因为我不理解完全位移和在实践中使用OR和AND运算符所以我试图用愚蠢的解决方案来解决我的问题,比如首先将int转换为Hex String然后转换为char等等。有人能帮我解决这个问题吗?抱歉我的英文。

5 个答案:

答案 0 :(得分:2)

这可能是一个可接受的解决方案,操纵指针。可以找到关于指针的优秀教程here

int main()
    {
      int test32 = 0 ;
      int* ptest32 = &test32;

      char* p1st8bits = (char*) ptest32;
      char* p2nd8bits = p1st8bits + 8;
      char* p3nd8bits = p1st8bits + 16;
      char* p4nd8bits = p1st8bits + 24;

      std::cout  <<"first 8 bits: " << *p1st8bits << "\n" ;
      std::cout  <<"second 8 bits: " << *p2nd8bits << "\n" ; 
      std::cout  <<"third 8 bits: " << *p3nd8bits << "\n" ;
      std::cout  <<"fourth 8 bits: " << *p4nd8bits << "\n" ;
    }

答案 1 :(得分:1)

试试这个:

const unsigned int value = 0x12345678;
std::ostringstream hex_stream;
hex_stream << hex << value;

上面的片段会将值转换为十六进制字符串。以下代码段将每行打印一个字符。

std::string chars_as_hex = hex_stream.str();
for (i = 0; i < chars_as_hex.length(); ++i)
{
  std::cout << chars_as_hex[i] << std::endl;
}

答案 2 :(得分:1)

  

我需要做同样但反之亦然。我想从一个int中创建4个字符。

只需反向操作即可。转移到右边而不是左边,并在移位之后而不是之前屏蔽:

char bytes[4];
long number = 0x00000190L; // int may be only 2 bytes on some implementations
for(int i = 0; i < 4; i++) {
    bytes[i] = (number >> (8 * i)) & 0xFFL;
}

如果您的目的是获取十六进制字符串(如标题所示,但不是链接问题的反面),那么最简单的方法是使用std::hex和一个流。< / p>

答案 3 :(得分:1)

使用位移:

#include <string>
#include <iostream>


void main(void* args)
{
  // 4 byte integer
  unsigned int charInteger = 0;

  // 4 characters
  unsigned char c1 = 'a';
  unsigned char c2 = 'b';
  unsigned char c3 = 'c';
  unsigned char c4 = 'd';

  // put each character above into each byte of a 4 byte integer
  charInteger = (c1 & 0xFF)
       | ((c2 & 0xFF) << 8) 
       | ((c3 & 0xFF) << 16)
       | ((c4 & 0xFF) << 24);

  std::cout << "charInteger = " << charInteger << "\n";

  // get each byte of the integer
  unsigned int i1 = charInteger & 0xff; // first byte
  unsigned int i2 = (charInteger >> 8) & 0xff; // second byte
  unsigned int i3 = (charInteger >> 16) & 0xff; // third byte
  unsigned int i4 = (charInteger >> 24) & 0xff; // fourth byte

  // display each byte of charInteger as characters
  std::cout << char(i1) << "\n";
  std::cout << char(i2) << "\n";
  std::cout << char(i3) << "\n";
  std::cout << char(i4) << "\n";

  std::string h;
  std::cin >> h;
}

答案 4 :(得分:0)

这应该做的工作:

const char* chars = (const char*)&number;

现在您可以访问数组中的字符:

chars[0], chars[1], chars[2], chars[3]

你可以反过来做同样的事情:

char chars[4];
// write each char in to array
int *pnumber = (int*)chars;
// now you can read the number: 
int number = (*pnumber);

此处的订单非常重要,具体取决于您系统的终端。