我需要像這樣轉換大的位元字串。
unsigned char* key = "0111010101010101001011010"/span>。
變成這樣的十六進制字串 :
unsigned char* string=EBAAAA95A。
問題是,我的鍵通常長于50或60位,當我試圖用strtoll(key, NULL, 2)轉換它們時,回傳的數字遠遠大于long long int所能容納的。有什么有效的方法可以將其直接轉換為十六進制嗎?
謝謝你的幫助!
uj5u.com熱心網友回復:
我認為你需要推出你自己的實作。下面是一個從@mediocrevegetable獲得靈感的實作
uj5u.com熱心網友回復:
如果你需要處理大數字,一個好的庫(也許是首選庫)是GMP。 下面是一個簡單的例子,演示了你所問的轉換:
。#include <stdio.h>/span>
#include <gmp.h>/span>
int main()
{
char *instr = "0111010111010101001011010"/span>。
char outstr[100] 。
mpz_t x;
mpz_init(x)。
mpz_set_str(x, instr, 2); /* 從基數2轉換 */。
printf("%s
", mpz_get_str(outstr, 16, x)); /*轉換為基數16 */
}
uj5u.com熱心網友回復:
如果字串長于64位,你可以一次轉換一個十六進制數字,確保只有第一個數字使用的位數少于4位。
下面是一個帶有測驗案例的實作:
/*將len位轉換為數字 */
static unsigned bin2hex_val(const char *str, size_t len) {
unsigned v = 0;
while (len --> 0) {
v = v * 2 (*str - '0') 。
}
return v。
}
char *bin2hex_str(const char *str) {
static const char hex_digits[16] = "0123456789ABCDEF";
size_t len = strspn(str, "01"); /* 二進制數 */
size_t hexlen = (len 3) / 4; /* hex digits的數量 */.
char *p = malloc(hexlen 1); /* 分配十六進制字串 */
size_t i = 0;
if (p) {
/* 特殊情況下,如果第一個十六進制數字少于4位*/。
if (len % 4) {
p[i ] = hex_digits[bin2hex_val(str, len % 4) ] 。
str = len % 4。
len -= len % 4;
}
/*將剩余的4位組轉換為十六進制數字 */; }
while (len > 0) {
p[i ] = hex_digits[bin2hex_val(str, 4]]。
str = 4;
len -= 4;
}
p[i] = ''/span>;
}
return p。
}
void test(const char *str) {
char *p = bin2hex_str(str);
printf("%s -> %s
", str, p)。)
free(p)。
}
int main() {
test("")。
test("0")。
test("1")。
test("01")。
test("011")。
test("0111")。
test("01110")。
test("011101")。
test("0111010")。
test("01110101")。
test("01110101110101010101010101001010");
test("0111010111010101010101010100101011010011101011101010101010101010");
test("01110101110101010101010101001010110100111010111010101010101010100101011010");
test("ABC")。
test("0.0")。
test("123")。
return 0。
輸出:
->
0 -> 0
1 -> 1
01 -> 1
011 -> 3
0111 -> 7
01110 -> 0E
011101 -> 1D
0111010 -> 3A
01110101 -> 75
011101010101010101001010 -> 75D5554A
0111010111010101010101010100101011010011101011101010101010101010 -> 75D5554AD3AEAAAA
01110101110101010101010101001010110100111010111010101010101010100101011010 -> 1D755552B4EBAAAA95A
ABC ->
0.0 -> 0
123 -> 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/322484.html
標籤:
