如何在C中手动将十进制值转换为十六进制字符串?

NB我知道这个问题已经以各种不同的方式和情况在StackOverflow上被询问过了,但是寻找我寻求的答案对我的具体情况并没有什么帮助。 所以,尽管这最初看起来像一个问题的重复,如何如何将整数转换为C中的十六进制字符串? 给出的答案是准确的,但对我无用。

我的问题是如何手动将十进制整数转换为十六进制字符串。 我知道stdlib.h和printf有一些节奏技巧,但这是一项大学任务,我需要手动完成(教授的命令)。 然而,我们被允许寻求帮助。

使用好旧的“除以16并将余数转换为十六进制并反转数值”的方法来获得十六进制字符串,但是在我的代码中必须有一个大错误,因为它不会让我回来,例如“BC”十进制值“188”。

假定该算法从不需要为大于256(或FF)的小数找到十六进制值。 虽然参数的传递可能不是最佳的或理想的,但这是我们被告知要使用的(尽管我可以修改getHexValue函数,因为我自己写了这个函数)。

这是我到目前为止:

/* Function to get the hex character for a decimal (value) between
 * 0 and 16.  Invalid values are returned as -1.
 */
char getHexValue(int value) 
{
   if (value < 0) return -1;
   if (value > 16) return -1;
   if (value <= 9) return (char)value;
   value -= 10;
   return (char)('A' + value);
}


/* Function asciiToHexadecimal() converts a given character (inputChar) to
 * its hexadecimal (base 16) equivalent, stored as a string of
 * hexadecimal digits in hexString. This function will be used in menu
 * option 1.
 */
void asciiToHexadecimal(char inputChar, char *hexString)
{
   int i = 0;
   int remainders[2];
   int result = (int)inputChar;
   while (result) {
      remainders[i++] = result % 16;
      result /= (int)16;
   }
   int j = 0;
   for (i = 2; i >= 0; --i) {
      char c = getHexValue(remainders[i]);
      *(hexString + (j++)) = c;
   }
}

char *hexString是我需要输出到屏幕(最终)的字符串的指针。 char inputChar参数,我需要转换为十六进制(这就是为什么我永远不需要转换值超过256)。

如果有更好的方法来做到这一点,它仍然使用void asciiToHexadecimal(char inputChar, char *hexString)函数,我是所有的耳朵, void asciiToHexadecimal(char inputChar, char *hexString) ,我的调试似乎表明值是好的,但输出结果如377而不是预期的十六进制字母数字表示。

对不起,如果这个问题本身(或代码)有任何术语或其他问题,我仍然对C的世界很陌生。

更新:我想到它可能与我在显示打印时显示值的方式相关,而不是错误的转换。 这里是:

char* binaryString = (char*) malloc(8);
char* hexString = (char*) malloc(2);
asciiToBinary(*(asciiString + i), binaryString);
asciiToHexadecimal(*(asciiString + i), hexString);
printf("%6c%13s%9sn", *(asciiString + i), binaryString, hexString);

(这段代码中的所有内容除了hexString之外都可以hexString


char getHexValue(int value)
{
   if (value < 0) return -1;
   if (value > 16) return -1;
   if (value <= 9) return (char)value;
   value -= 10;
   return (char)('A' + value);
}

您可能希望打印出您为每个感兴趣的值调用此例程所获得的字符。:)( printf(3) format %c 。)

当您使用介于0和9之间的数字调用getHexValue()时,您将返回一个介于0和9之间的ASCII控制字符范围内的数字。 当您以10到15之间的数字调用getHexValue()时,您将返回一个介于65和75之间的ASCII字母范围内的数字。

布道? 如果您在编写代码的同时编写测试,单元测试可以节省您的时间。

有些人喜欢先写测试。 虽然我从来没有遵守这种方法的纪律,但知道你必须编写测试会迫使你编写更容易测试的代码。 而且更容易测试的代码更少耦合(或“更多解耦”),这通常会导致更少的错误!

尽早且经常地写测试。 :)

更新 :在你包含你的输出代码后,我不得不对此评论:)

char* binaryString = (char*) malloc(8);
char* hexString = (char*) malloc(2);
asciiToBinary(*(asciiString + i), binaryString);
asciiToHexadecimal(*(asciiString + i), hexString);
printf("%6c%13s%9sn", *(asciiString + i), binaryString, hexString);

hexString已被分配一个字节太小而不能成为C字符串 - 您忘记为ASCII NUL ''字符留出空间。 如果您使用%c格式说明符打印hexString ,或者使用memcpy(3)构建更大的字符串,则可能没问题,但您的printf()调用将hexString作为字符串处理。

一般来说,当你看到一个

char *foo = malloc(N);

打电话,害怕 - C成语是

char *foo = malloc(N+1);

+1是你向其他人(以及你自己,两个月内)发出的信号,表明你已经为NUL留下空间。 如果您在另一次计算中隐藏了+1 ,那么您错过了一次记住每次读取代码时都可以捕获这些错误的模式的机会。 (老实说,我在两天前通过这个确切的模式发现了其中的一个。:)


目标是纯粹的十六进制还是应该是可参数化的。 如果它被限制为十六进制,为什么不利用这个事实,即一个十六进制数字正好编码四位?

这是我该怎么做的:

#include <stdlib.h>

#include <limits.h> /* implementation's CHAR_BIT */

#define INT_HEXSTRING_LENGTH (sizeof(int)*CHAR_BIT/4)
/* We define this helper array in case we run on an architecture
   with some crude, discontinous charset -- THEY EXIST! */
static char const HEXDIGITS[0x10] = 
    {'0', '1', '2', '3', '4', '5', '6', '7',
     '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
void int_to_hexstring(int value, char result[INT_HEXSTRING_LENGTH+1])
{
    int i;
    result[INT_HEXSTRING_LENGTH] = '';

    for(i=INT_HEXSTRING_LENGTH-1; value; i--, value >>= 4) {
        int d  = value & 0xf;
        result[i] = HEXDIGITS[d];
    }

    for(;i>=0;i--){ result[i] = '0'; }
}
int main(int argc, char *argv[])
{
    char buf[INT_HEXSTRING_LENGTH+1];

    if(argc < 2)
        return -1;

    int_to_hexstring(atoi(argv[1]), buf);
    puts(buf);
    putchar('n');

    return 0;
}

我让一个图书馆在不使用stdio.h情况下进行十六进制/十进制转换。 使用非常简单:

char* dechex (int dec);

这将使用calloc()来返回一个指向十六进制字符串的指针,通过这种方式来优化内存的使用量,所以不要忘记使用free()

这里github上的链接:https://github.com/kevmuret/libhex/

链接地址: http://www.djcxy.com/p/51413.html

上一篇: How to manually convert decimal value to hexadecimal string in C?

下一篇: password security in PHP