C中的无符号字符连接
Posted
技术标签:
【中文标题】C中的无符号字符连接【英文标题】:Unsigned Char Concat In C 【发布时间】:2016-12-30 14:38:53 【问题描述】:我正在尝试将字符串消息转换为 C 中的十六进制值。
例如,如果我有类似“abc”的消息,我想在 162636 等之前收到它。我的代码如下。在这段代码中,我必须做一些 concat 操作来存储它们,但现在我只能存储 36 个。我该如何存储它们?
unsigned char swapNibbles(char x)
return ( (x & 0x0F)<<4 | (x & 0xF0)>>4 );
void encode(char *message, char password[40])
unsigned char *reversedInput = malloc(strlen(message));
for (int i = 0; i < strlen(message); ++i)
reversedInput=swapNibbles(message[i]);
printf("%2x TERS ",reversedInput);
//unsigned char *bitwiseMessage = (unsigned char*)message;
//printf("DÜZ %s\n",bitwiseMessage);
//printf("TERS %u\n", swapNibbles(bitwiseMessage));
【问题讨论】:
这个答案提供了一种方法来做到这一点***.com/a/41356195/7076153 Please see this discussion on why not to cast the return value ofmalloc()
and family in C
..
@Berkin 这是不投稿的另一个原因。您是否包含stdlib.h
?
malloc(strlen(...))
(几乎总是)是错误的。
你在做什么?将strlen()
转换为指针并将其传递给malloc
?!你的编译器应该为此对你大喊大叫。
【参考方案1】:
编辑
我的十六进制编码解决方案:IDEOne
如果您希望对文本进行十六进制编码,则必须分配 两倍 与原始消息一样多的空间:
"abc" (3 bytes) ==> "616263" (6 bytes)
所以你需要:
unsigned char *reversedInput = malloc(2*strlen(message)+1); // +1 for the final NULL-terminator
#include <string.h>
#include <malloc.h>
char* HexEncode(char* txt)
char* hexTxt = calloc(2*strlen(txt)+1,1);
for(char* p=hexTxt; *txt; p+=2)
sprintf(p, "%02x", *txt++);
return hexTxt;
int main()
char* hexText = HexEncode("Hello World");
printf("Hexed is %s\n", hexText);
free(hexText);
return 0;
输出
Hexed is 48656c6c6f20576f726c64
【讨论】:
谢谢 :) 我改好了 注意:如果目的是存储字符reversedInput
应该是char *
类型。
感谢您帮助我。非常感谢 :) 这正是我所需要的
sprintf(p, "%0x", *txt);
--> sprintf(p, "%0x", (unsigned char)*txt);
试试HexEncode("Hello\tWorld")
--> "48656c6c6f9"
。 sprintf(p, "%0x", *txt++);
只能打印 1 个字符。建议sprintf(p, "%02x", *txt++);
以上是关于C中的无符号字符连接的主要内容,如果未能解决你的问题,请参考以下文章