ASN.1 BITSTRING을 만들려고합니다.
시작하려면 출력에 "abcd..."
있어야한다고 생각 { 0xab, 0xcd ... }
하지만 어디서 시작할지 확실하지 않은 긴 16 진수 문자열 이 있습니다 (한 번 sscanf()
에 2 자로?). char[]
with 로 잘못 변환 한 후 깨달았 1010101111001101
지만 이것은 바이너리 출력이 아니라 문자열로 표시된 바이너리 숫자입니다.
C에서 16 진수 문자열을 이진 문자열로 변환하는 방법이 작동하지 않는 것 같습니다 (res 배열이 비어 있음).
의견을 바탕으로 (그리고 훌륭한 답변을보기 전에) 다음을 생각해 냈습니다. 답변을 표시하기 전에 다른 사람이 댓글을 달도록합니다.
char input[] = "abcd";
char output[MAX_LENGTH];
char c[3];
int p = 0;
int b = 0;
while (input[p])
{
strncpy(c, input + p, 2);
c[2] = '\0';
p += 2;
output[ b++ ] = strtol(c, NULL, 16);
}
문자 0
- 9
및 A
- F
(또는 소문자 버전) 만 포함하는 임의 길이의 C 문자열을 가정하면 다음과 같이 쉽게 얻을 수 있습니다.
16 진수의 한 자리는 이진수로 4 비트이므로 두 자리는 단일 바이트를 형성하므로 length / 2
완전한 변환 결과를 저장 하려면 바이트 가 필요 합니다.
uint8_t * hexstr_to_bin(char const * str) {
size_t const length = strlen(str);
uint8_t * result = malloc((length + 1) / 2);
// ...
return result;
}
그런 다음 한 번에 하나씩 문자를 반복하고 이진 표현으로 변환 할 수 있습니다.
size_t it;
for (it = 0; it < length; ++it) {
char const c = str[it];
uint8_t const bin = (c > '9') ? (tolower(c) - 'a' + 10) : (c - '0');
// ...
}
그리고 올바른 위치에 할당하십시오.
if (it % 2 == 0) {
result[it / 2] = bin << 4;
} else {
result[it / 2] |= bin;
}
물론 결과 배열에서 값을 정렬 할 수있는 많은 가능성이 있습니다. 위의 코드는 여기에 있습니다. (테스트되지는 않았지만)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다