簡體   English   中英

我想將 int 轉換為 char 數組,其中 int 的 0-7 位是第一個 char 8-15 第二個等

[英]I want to convert int to char array where 0-7 bits of int are 1st char 8-15 2nd etc

所以這里是代碼,但由於某種原因 intToChar function 返回“abcd”,最后還有一些亂碼。 我試圖首先將我新創建的數組更改為 0,但隨后出現訪問沖突錯誤。

int charToInt(char x[])
{
    int z = 0;
    for (int i = 0; i < sizeof(int) / sizeof(char) && x[i]; i++)
    {
        z <<= sizeof(char) * 8;
        z |= x[i];
    }
    return z;
}
char* intToChar(int x)
{
    char* z = new char[5];
    for (int i = (sizeof(z) / sizeof(z[0]) - 1); i >= 0; i--)
    {
        z[i] = x;
        x >>= sizeof(char) * 8;
    }
    return z;
}

int main()
{
    char xd[5] = "abcd";
    cout << xd;
    cout << endl;
    int x = charToInt(xd);
    cout << x;
    cout << endl;
    char* y = intToChar(x);
    cout << y;
    cout << endl;
    return 0;
}

如評論中所述,您對sizeof(z)的使用是sizeof(a_pointer) - 不是您想要的。 相反,鑒於sizeof(char)始終為1 ,您可以簡單地執行以下操作:

#include <iostream>

int charToInt (char *x)
{
    int z = 0;
    
    for (size_t i = 0; i < sizeof(int) && x[i]; i++)
    {
        z <<= 8;
        z |= x[i];
    }
    
    return z;
}

char *intToChar (int x)
{
    char *z = new char[5];
    
    for (int i = (int)sizeof (int) - 1; i >= 0; i--)
    {
        z[i] = x;
        x >>= 8;
    }
    
    return z;
}

int main()
{
    char xd[5] = "abcd";
    std::cout << xd << '\n';
    
    int x = charToInt (xd);
    std::cout << x << '\n';
    
    char *y = intToChar(x);
    std::cout << y << '\n';
}

注意:循環限制已調整以反映您在轉換中僅使用 4 字節的事實)

示例使用/輸出

$ ./bin/chr2int2char
abcd
1633837924
abcd

或者,您可以編寫intToChar()如下:

char *intToChar (int x)
{
    char *z = new char[5];
    int i  = sizeof (int);
    z[i] = 0;               /* affirmatively nul-terminate z */
    
    while (i--)
    {
        z[i] = x;
        x >>= 8;
    }
    
    return z;
}

此外,如果您從除main()以外的 function 調用,則需要確保delete[] y; 避免 memory 泄漏,例如

    char *y = intToChar(x);
    std::cout << y << '\n';
    
    delete[] y;

如果您還有其他問題,請告訴我。

您編寫的代碼中有幾個問題:

  1. 你這樣做: "(sizeof(z) / sizeof(z[0]) - 1)"但“z”的大小是指針的大小,在當今大多數PC中為8字節。

  2. 您尚未在 char* 的最后一個字節中的字符串中設置 null 終止符

z[4] = '\0';

  1. 忘記刪除char*的動態分配了,打印后應該在主function中刪除。

如果您將解決所有這些問題,它將按預期工作,但在這里您有一個簡單的代碼來執行您的意思:

int charToInt(char x[])
{
    int z = 0;
    for (int i = 0; i < 4; i++)
    {
      z <<=  8;        
      z |= x[i];
    }
    return z;
}


char* intToChar(int x)
{  
  char* z = new char[5];
  for(int i = 0; i < 4; ++i) {
    z[i] = x >> (4 - i - 1) * 8;
  }
  z[4] = '\0';
  
  return z; 
}


int main()
{
  char xd[5] = "abcd";
  cout << xd << endl;
  
  int x = charToInt(xd);
  cout << x <<endl;
  
  char* y = intToChar(x);
  cout << y << endl;
  delete[] y;
  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM