【问题标题】:Convert long to 6 letter hex string将 long 转换为 6 个字母的十六进制字符串
【发布时间】:2020-08-06 08:07:20
【问题描述】:

我有一个长值,我想将其转换为 6 位十六进制字符串。

我的尝试:

long ID = some value;

char * hex = (char *) calloc(n, sizeof(char)); // dynamic memory required.

int c = sprintf(hex, n+1, "%x", ID);

assert(c == ID);

1) 我怎样才能找到'n' 的值给calloc?

2) 如何使字符串只有 6 个十六进制字符?

谢谢。

【问题讨论】:

  • 1.您可以使用 sizeof(long) 获取 long 变量的大小。 2. 不确定为什么需要将字符串设为 6 个十六进制字符? 3.使用char指针指向long变量时,需要考虑endian。
  • 写入字符串时限制缓冲区大小的打印函数是snprintf,而不是sprintf。传递 n 作为第二个参数,而不是 n + 1。 snprintf 和类似函数的返回值是已写入的字符数,或者如果缓冲区足够大则将要写入的字符数。如果您只想填充一个十六进制字符串,以便少于 6 位的数字在开头有零,例如000ff7,使用"%06lx"。更大的数字仍然会被写入并需要更大的缓冲区。
  • long 可以保存的值是从LONG_MIN 到LONG_MAX。检查LONG_MIN 需要多少个字符并将其用作最大值:int mxlng = snprintf(0, 0, "%lx", LONG_MIN);

标签: c char hex data-conversion


【解决方案1】:

十六进制位数可以这样计算:

int numberOfHexDigits(long ID)
{
    int n=0;
    if (ID==0) {
        return 1;
    }
    while (ID!=0) 
    {
        ID >>= 4;
        n++;
    }
    return n;
}

使用 calloc(或 malloc)仅分配 7 个字节的内存是浪费的。我认为你有理由这样做。你最好这样做:

const int nDigits = 6;
char hex[nDigits+1];
snprintf(hex, sizeof(hex), "%lx", ID);

如果你真的想在堆上分配内存:

int bufSize = numberOfHexDigits(ID)+1;
char *hex = (char *) malloc(bufSize);
snprintf(hex, bufSize, "%lx", ID);

【讨论】:

  • if (ID==0) { return 1; } 不需要 do { ID >>= 4; n++; } while (ID!=0);
猜你喜欢
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 2013-02-07
  • 2018-01-22
  • 2019-01-10
  • 1970-01-01
相关资源
最近更新 更多