gpt4 book ai didi

c++ - 如何在 Arduino 上将 HexBytes 数组转换为 C/C++ 中的字符串?

转载 作者:行者123 更新时间:2023-11-28 06:54:10 24 4
gpt4 key购买 nike

我意识到将 String 转换为 hexarray 现在需要将新数组转换为新字符串,因为函数 Sha256.write 需要一个 char,这样会怎样?

    char hexstring[] = "020000009ecb752aac3e6d2101163b36f3e6bd67d0c95be402918f2f00000000000000001036e4ee6f31bc9a690053320286d84fbfe4e5ee0594b4ab72339366b3ff1734270061536c89001900000000";
int i;
int n;

uint8_t bytearray[80];
Serial.println("Starting...");
char tmp[3];
tmp[2] = '\0';
int j = 0;

//GET ARRAY
for(i=0;i<strlen(hexstring);i+=2) {
tmp[0] = hexstring[i];
tmp[1] = hexstring[i+1];
bytearray[j] = strtol(tmp,0,16);
j+=1;
}

for(i=0;i<80;i+=1) {
Serial.println( bytearray[i]);
}


int _batchSize;
unsigned char hash[32];
SHA256_CTX ctx;
int idx;
Serial.println("SHA256...");
for(_batchSize = 100000; _batchSize > 0; _batchSize--){
bytearray[76] = nonce;
// Sha256.write(bytearray);
sha256_init(&ctx);
sha256_update(&ctx,bytearray,80);
sha256_final(&ctx,hash); //
sha256_init(&ctx);
sha256_update(&ctx,hash,32);
sha256_final(&ctx,hash); //are this corrent? i'm need in bytes too
// print_hash(hash);
int zeroBytes = 0;
for (int i = 31; i >= 28; i--, zeroBytes++)
if(hash[i] > 0)
break;
if(zeroBytes == 4){ // SOLUTION TRUE, NOW I'M NEED THIS IN STRING
printf("0x");
for (n = 0; n < 32; n++)
Serial.println(printf("%02x", hash[n])); //ERROR :(
}
//increase
if(++nonce == 4294967295)
nonce = 0;

}

}


}

串口输出数组:

2
0
0
0
158
203
117
42
172
62
109
33
1
22
59
54
243
230
189
103
208
201
91
228
2
145
143
47
0
0
0
0
0
0
0
0
16
54
228
238
111
49
188
154
105
0
83
50
2
134
216
79
191
228
229
238
5
148
180
171
114
51
147
102
179
255
23
52
39
0
97
83
108
137
0
25
0
0
0
0

如何将其转换回十六进制字符?

已更新

这个解决方案对我有用,谢谢大家!

void printHash(uint8_t* hash) {
int id;
for (id=0; id<32; id++) {
Serial.print("0123456789abcdef"[hash[id]>>4]);
Serial.print("0123456789abcdef"[hash[id]&0xf]);
}
Serial.println();
}

最佳答案

跳到部分 Addressing your code... 最相关内容的底部
(这里的东西几乎没什么用)

你的功能的目的:

Sha256.write((char *)bytearray);

我认为是将更多数据写入运行哈希。 ( from this ) 因此,我不确定您问题的上下文如何将其转换为十六进制字符串字符?这与您使用它的方式有何关系。

为了说明,让我提供另一种方法来将整数数组返回为“十六进制字符串”的形式: p>

From Here

这是一个代码片段,它将计算字符串“abc”的摘要

   SHA256_CTX ctx;
u_int8_t results[SHA256_DIGEST_LENGTH];
char *buf;
int n;

buf = "abc";
n = strlen(buf);
SHA256_Init(&ctx);
SHA256_Update(&ctx, (u_int8_t *)buf, n);
SHA256_Final(results, &ctx);

/* Print the digest as one long hex value */
printf("0x");
for (n = 0; n < SHA256_DIGEST_LENGTH; n++)
printf("%02x", results[n]);
putchar('\n');

导致:

"0xba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad".   

在这个例子中我相信你想要的数组包含在u_int8_t结果

您的帖子中没有足够的描述来确保这会有所帮助,请在评论中告诉我,我会尝试解决更多问题。

在您编辑后添加:

继续上面的示例,要将 results 的数组内容放回字符串中,您可以这样做:

char *newString;
newString = malloc(sizeof(char)*SHA256_DIGEST_LENGTH*2);
memset(newString, 0, sizeof(char)*SHA256_DIGEST_LENGTH*2);
strcat(newString, "0x");
for(i=0;i<SHA256_DIGEST_LENGTH;i++)
{
sprintf(newString, "%s%02x\n", newString, results[i]);
}
//use newString for stuff...
free(newString);

直接解决您的代码和问题:

你的代码块:

  for(_batchSize = 100000; _batchSize > 0; _batchSize--){
bytearray[76] = _batchSize;
Sha256.write((char *)bytearray); //here are the error
}

如果您只想int 数组转换为“十六进制字符串”

,则

不是必需的

您的 int 数组,定义为:

int bytearray[80];  

此时已经包含所有必要的值,正如您在最新编辑中所说明的那样。如果您想将此数据返回为“十六进制字符串”形式,那么这将为您完成:(将 result 替换为您的 bytearray)

char *newString;
newString = malloc(sizeof(char)*SHA256_DIGEST_LENGTH*2);//if these defines are not in your environment
memset(newString, 0, sizeof(char)*SHA256_DIGEST_LENGTH*2);//then replace them with appropriate value for length
strcat(newString, "0x");
for(i=0;i<sizeof(bytearray)/sizeof(bytearray[0]);i++)
{
sprintf(newString, "%s%02x\n", newString, bytearray[i]);
}
//use newString for stuff...
free(newString);

关于c++ - 如何在 Arduino 上将 HexBytes 数组转换为 C/C++ 中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23391125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com