我有STR:Ç - 字符到六
char *str = "lala";
现在,我想在STR转换任何字符为十六进制,例如:
str = convert(str);
print str: 0x6C 0x61 0x6C 0x61
^l^a^l^a
我可怎么办呢?
我有STR:Ç - 字符到六
char *str = "lala";
现在,我想在STR转换任何字符为十六进制,例如:
str = convert(str);
print str: 0x6C 0x61 0x6C 0x61
^l^a^l^a
我可怎么办呢?
char* x = str - 1;
while(*++x) printf("%02x ", (int) *x); // Print one character in hex
printf("\n") // Finish with a carriage return
char *convert(char const *str) {
int len = strlen(str);
char *retVal = (char *)malloc(5 * len);
char *pos = retVal;
int i;
for(i = 0; i < len; ++i, pos += 5) sprintf(pos, i? " 0x%x" : "0x%x", str[i]);
retVal[5 * len - 1] = '\0';
return retVal;
}
可能会错过一些东西,没有使用下八年。
只问printf的做到这一点:
void convert(char* str, size_t length) {
size_t i;
for(i = 0; i < length; i++)
printf("0x%02x ", str[i]);
}
您可以使用此实现实现它....
#define MAX 100
char *convert(char *str)
{
char *hexStr = (char *)malloc(strnlen(str, MAX) * 5);
if (hexStr == NULL)
return NULL;
int i,j;
for (i=0, j=0; str[i]; j+=5, i++)
sprintf(hexStr + j, "0x%02x ", str[i]);
hexStr[--j] = '\0';
return hexStr;
}
缓冲区溢出的潜力:'sprintf()'会写入'0xNN \ 0',所以如果长度为2,那么它将分配10个字节,但它会写'0xNN 0xNN \ 0'(11字节)。除此之外,很好地完成:) –
for循环不会将空字符写入缓冲区。语句hexStr [ - j] ='\ 0';在最后一个空格字符处写入空字符。所以,不应该发生缓冲区溢出。 – abhiarora
'sprintf()'函数总是写入一个空字符。从C标准:除了输出写入数组(由参数指定)而不是写入流之外,'sprintf'函数等同于'fprintf'。在写入字符的末尾写入空字符; ...因此,当您使用'sprintf()'向缓冲区写入5个字符时,您还在末尾写入第6个字符:空字符。 –
这个代码是未定义行为。指针运算只在*数组内有效*(包括一次性结束指针)。 (然后,我希望人们停止使用增量子表达式,只是为了炫耀他们“知道C”。) –
可以使用'char * x = str; while(* x)printf(“%02hhx”,* x ++);'并避免最初的'str-1'。 '(int)'没有用处。 – chux
@KerrekSB在这个问题中,'str'指向一个字符数组。在我的回答中,'x'在不改变'str'的情况下迭代该数组。当它指向'str'的边界之外时,'x'不会被解引用。 – Logicrat