在C中将char *转换为unsigned char数组

时间:2017-12-15 18:39:28

标签: c arrays

我想优化我的代码并避免错误,我有这个功能可以完成"工作"但我认为我可以改善并避免记忆问题。

void function(char* message)
{
    char * pointer;
    unsigned char buffer[2048] = {0};
    int buffer_len = 0;

    memset(buffer, 0, sizeof(buffer));
    strcpy(buffer, message);

    buffer_len = strlen(buffer);
    memset(buffer, 0, sizeof(&buffer));

    for(int i = 0, pointer = message; i < (buffer_len / 2); i++, pointer += 2)
    {
        sscanf(pointer, "%02hhX", &buffer[i]);
    }
}

该功能的想法是接收这种风格的字符串&#34; 0123456789&#34;并将其传递给0x01,0x23,0x45,...在unsigned char数组中。任何提示,良好实践或改进都将非常有用。

ussage是这样的:

function("0123456789");

在函数缓冲区中结束如:

buffer[0] = 0x01
buffer[1] = 0x23
...

2 个答案:

答案 0 :(得分:2)

可以进行一些优化。 最大的优化来自避免做  2x memsetstrcpy

无需:

// memset(buffer, 0, sizeof(buffer)); 
// strcpy(buffer, message);
// memset(buffer, 0, sizeof(&buffer));  

大大简化了代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void function(char* message)
{
    unsigned char * pointer;
    unsigned char buffer[2048]; // not needed = {0}; 
    int buffer_half_len; // not needed = 0;

    buffer_half_len = strlen(message)/2;  // avoiding division in the for loop;
    pointer = message;

    for(int i = 0;  i < buffer_half_len; i++, pointer += 2)
    {
        sscanf(pointer, "%02hhX", &buffer[i]);
        printf("%02hhX\n", buffer[i] );
    }
}

输出:

01
23
45
67
89

答案 1 :(得分:0)

char * a= -80; // let supposed you get returned value( i represented in int) from whatever source.
unsigned char b = * a; // now b equal the complemntry of -80 which will be 176
std::cout << b ;