輸出二元資料
2008年9月8日 星期一 by Anati
寫程式的時候,如果有做bit的運算如邏輯and, or等等的運算,那往往資料如果有錯誤的話都需要使用除錯程式來找,但是如果只是單單想看它的二元資料的話,轉換成字串就好了,所以設計了可以將32bit的資料空間轉換為二元資料的函式和將字串轉成二進制資料的函數。
※ 轉換32bit資料成為二進制值
1. 先建立輸出的空間為33(別忘了有null)空字元[0~32]
2. 從第32要放'\0'空字元
3. 跑迴圈將資料從最低位元填到最高位元31~0
4. 每次執行一次和1做&位元運算後加上'0'成為真實的ascii code
5. 每次執行一次迴圈使用shift right一位元
Example:
char* itob(int n, char* buffer)
{
int size = sizeof(int)*8;
int i;
for (i = size-1; i >= 0; - -i)
{
buffer[i] = (1 & n) + '0';
n >>= 1;
}
buffer[size] = '\0';
return buffer;
}
int main()
{
int n = 10;
char buf1[8*sizeof(int)+1] = {0};
printf("%s\n", itob(n, buf1));
return 0;
}
※ 轉換字串為二進制值
我們要將字串的每一個字元轉成8bits的字元,比如說a是97所以二進制為01100001所以可以透過以下方法,將資料轉換。
1. 配置足夠大可以讓轉換後的資料放的記憶體空間
2. 所配的空間大小8*strlen(str)+1 (別忘了還有null)
3. 對於每個字元將資料從最低位元填到最高位元7~0
4. 對於每個字元執行一次和1做&位元運算後加上'0'成為真實的ascii code
5. 對於每個字元執行一次迴圈使用shift right一位元
6. 移動字元指標指向下一個字元
圖解:
"abc" => { 97, 98, 99, 0} (系統看到的二進制)
{ 01100001, 01100010, 01100011, 00000000} (1個字元8bits)
{ 0, 1, 1, 0, 0, 0, 0, 1, 0 ,1 ,1 , 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, null } (轉換後)
Example:
char* strtob(char* str, char* buffer, int size)
{
char* tmp_str = (char*)calloc(size, sizeof(char));
memcpy(tmp_str, str, size);
int i, j;
char* ptr_buf = buffer;
for (i = 0; i < size; ++i)
{
char ch = tmp_str[i];
for (j = 7; j >= 0; - -j)
{
ptr_buf[j] = (1 & ch) + '0';
ch >>= 1;
}
ptr_buf += 8;
}
*++ptr_buf = '\0';
free(tmp_str);
return buffer;
}
int main()
{
char str[] = "abcd";
char* buf2 = (char*)calloc(8*sizeof(str)+1, sizeof(char));
printf("%s\n", strtob(str, buf2, sizeof(str)));
return 0;
}
※ 轉換32bit資料成為二進制值
1. 先建立輸出的空間為33(別忘了有null)空字元[0~32]
2. 從第32要放'\0'空字元
3. 跑迴圈將資料從最低位元填到最高位元31~0
4. 每次執行一次和1做&位元運算後加上'0'成為真實的ascii code
5. 每次執行一次迴圈使用shift right一位元
Example:
char* itob(int n, char* buffer)
{
int size = sizeof(int)*8;
int i;
for (i = size-1; i >= 0; - -i)
{
buffer[i] = (1 & n) + '0';
n >>= 1;
}
buffer[size] = '\0';
return buffer;
}
int main()
{
int n = 10;
char buf1[8*sizeof(int)+1] = {0};
printf("%s\n", itob(n, buf1));
return 0;
}
※ 轉換字串為二進制值
我們要將字串的每一個字元轉成8bits的字元,比如說a是97所以二進制為01100001所以可以透過以下方法,將資料轉換。
1. 配置足夠大可以讓轉換後的資料放的記憶體空間
2. 所配的空間大小8*strlen(str)+1 (別忘了還有null)
3. 對於每個字元將資料從最低位元填到最高位元7~0
4. 對於每個字元執行一次和1做&位元運算後加上'0'成為真實的ascii code
5. 對於每個字元執行一次迴圈使用shift right一位元
6. 移動字元指標指向下一個字元
圖解:
"abc" => { 97, 98, 99, 0} (系統看到的二進制)
{ 01100001, 01100010, 01100011, 00000000} (1個字元8bits)
{ 0, 1, 1, 0, 0, 0, 0, 1, 0 ,1 ,1 , 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, null } (轉換後)
Example:
char* strtob(char* str, char* buffer, int size)
{
char* tmp_str = (char*)calloc(size, sizeof(char));
memcpy(tmp_str, str, size);
int i, j;
char* ptr_buf = buffer;
for (i = 0; i < size; ++i)
{
char ch = tmp_str[i];
for (j = 7; j >= 0; - -j)
{
ptr_buf[j] = (1 & ch) + '0';
ch >>= 1;
}
ptr_buf += 8;
}
*++ptr_buf = '\0';
free(tmp_str);
return buffer;
}
int main()
{
char str[] = "abcd";
char* buf2 = (char*)calloc(8*sizeof(str)+1, sizeof(char));
printf("%s\n", strtob(str, buf2, sizeof(str)));
return 0;
}