吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2068|回复: 9
收起左侧

[求助] 求一份C语言,const char* 转uint8_t数组方法

[复制链接]
liven001 发表于 2021-3-22 13:42
已知数据:
const char* keyStr = "7E360165C72B";

想转换成如下数据
uint8_t keya[6] = { 0x7E, 0x36, 0x01, 0x65, 0xC7, 0x2B };

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ZB_陈 发表于 2021-3-22 13:49
百度搜索 C hex 转数组
苏紫方璇 发表于 2021-3-22 13:50
无闻无问 发表于 2021-3-22 13:53
wildfire_810 发表于 2021-3-22 13:58
记得做好容错
pzx521521 发表于 2021-3-22 14:12
楼上正解, 这种问题自己搜一下更好
[C] 纯文本查看 复制代码
/**
 * 字符串转字节数组
 * [url=home.php?mod=space&uid=952169]@Param[/url] source
 *  字符串
 * @param length
 *  字符串长度
 * @param target
 *  字节数组
 * @param n
 *  转换后长度
 */
void hex_2_uint8(const char* source, size_t length, uint8_t* target, size_t n) {
    n = 0;
    for (int i = 0; i < length; i += 2) {
        if (source[i] >= 'a' && source[i] <= 'f') {
            target[n] = static_cast<unsigned char>(source[i] - 'a' + 10);
        }
        else if (source[i] >= 'A' && source[i] <= 'F') {
            target[n] = static_cast<unsigned char>(source[i] - 'A' + 10);
        }
        else {
            target[n] = static_cast<unsigned char>(source[i] - '0');
        }
        if (source[i + 1] >= 'a' && source[i + 1] <= 'f') {
            target[n] = static_cast<unsigned char>((target[n] << 4) | (source[i + 1] - 'a' + 10));
        }
        else if (source[i + 1] >= 'A' && source[i + 1] <= 'F') {
            target[n] = static_cast<unsigned char>((target[n] << 4) | (source[i + 1] - 'A' + 10));
        }
        else {
            target[n] = (target[n] << 4) | (source[i + 1] - '0');
        }
        ++n;
    }
}
int main() {
    const char* keyStr = "7E360165C72B";
    uint8_t keya[6] = { 0x7E, 0x36, 0x01, 0x65, 0xC7, 0x2B };
    uint8_t test[6];
    hex_2_uint8(keyStr, 12, test, 6);
}
zsjalive 发表于 2021-3-22 14:12
baidu搜索,很多的。
HEIMEI 发表于 2021-3-22 16:17
int string_to_hex(char *string, uint8_t *hex)
{
        char *p;
        int i;
        uint8_t tmp;

        for (i = 1, p = string; *p != '\0'; p++, i++)
        {
                if (*p > '9')
                {
                        tmp = *p - 55;
                }
                else
                {
                        tmp = *p - '0';
                }
               
                printf("tmp = %#x\n", tmp);

                if (!(i % 2))
                {
                        *hex |= tmp;
                        hex++;       
                }
                else
                {
                        *hex = tmp << 4;
                }
        }

        return 0;
}
似水無痕 发表于 2021-3-22 20:03
[C] 纯文本查看 复制代码
#include <stdio.h>
#include <stdint.h>

#define ArraySize 6

int stringToUint8(const char* str, uint8_t* array, int arraySize);

int main(void)
{
	const char* keyStr = "7E360165C72B";
	uint8_t keya[ArraySize] = {0};
	int arrayValidLen=stringToUint8(keyStr, keya, ArraySize);
	for (int i = 0; i < arrayValidLen; i++)
		printf("%#x\t", keya[i]);
	return 0;
}

int stringToUint8(const char* str, uint8_t* array, int arraySize)
{
	int arrayValidLen = 0;
	for (int arrayElement = 0; arrayValidLen < arraySize && str[arrayValidLen * 2] != '\0'; arrayValidLen++)
	{
		sscanf(&str[arrayValidLen * 2], "%2x", &arrayElement);
		array[arrayValidLen] = arrayElement;
	}
	return arrayValidLen;
}
c03xp 发表于 2021-3-23 10:59
我也发一个,也是以前网上找的,先把字符串整体转换成数字,然后通过位运算得到各个分量,可能数字太大会溢出,可以把函数改良成64位的

[C] 纯文本查看 复制代码
static UCHAR a2xtable[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,
0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };

UINT util_atox(const char* s) {
    UINT res = 0;
    while (*s) {
        res = (res << 4) | a2xtable[*s++];  //利用二进制和十六进制之间的换算方法
    }
    return res;
}
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 04:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表