2021年1月11日 星期一

C語言 - 字串反轉

void reverse(char str[]){

int i=0,j=0;

while(str[i]!='\0'){

i++;

}

printf("轉換後的字串: ");

for(j=i-1;j>=0;j--){

printf("%c",str[j]);

}

printf("\n");

}

int main()

{

    printf("Hello World \n");

    

    char Input[50] = {"Hello World"};

    

    printf("%c, %c \n", Input[0],Input[1]);

    

    

    reverse(Input);


    return 0;

}




輸出結果:

Hello World                                                                                                                                    
H, e                                                                                                                                           
轉換後的字串: dlroW olleH 

2016年10月7日 星期五

32位元位址移到64位元環境造成死機怎修正

簡易改法
把原本定義成32位元的位址空間 改用intptr_t


Why?
stdint.h 內定義了 intptr_t 這個type
當你需要把pointer 轉型成 integer 的時候 你不確定是32 or 64bit
就可以使用intptr_t


if偵測到是64bit
intptr_t 就是long int  ( 64位元的long int 是64bit, 但32位元的long int是32bit)
否則就是 int   ( 64位元的 int 是32bit, 32位元的int 也是32bit)


此外size_t 定義成unsigned integer
而且是平台相關的
在64bit machine  size_t 是unsigned long
但在32bit machine size_t 是unsigned int


Reference:
http://nickhung0807.blogspot.tw/2014/05/blog-post.html

2015年8月4日 星期二

何謂簽章?


數位簽章原理[1]

可配合下面的圖來看

簽章基本原理是這是建立於PKI (Public Key Infrastructure)的環境

關於PKI可以看這個網頁的基本介紹: http://www.synnex.com.tw/asp/fae_qaDetail.asp?topic=FAE&group=&parent=&classifyid=01534&seqno=17477

首先要先掌握好一組key pair(private key and public key) 一端會用private key來做加密; 而且只有握有對應的public key的接收端才有辦法解密

所謂簽章就是一端先算出一個digest(摘要), 然後再用私鑰(private key)把這digest做加密;

另外一端則是用對應的公開金鑰(public key)去解出digest, 然後再用相同的演算法重算一次digest, 然後比較兩者是否相同 如果相同代表簽章確認OK! 東西沒有被竄改過

算出digest(摘要)有很多種方法 ex. md5sum, SHA, MAC, HMAC …. 詳情請參閱密碼學相關書籍或者網頁

以MD5而言,會有下面截圖這種結果,你可以想像成算出來的digest就是一種指紋的概念,不同的人指紋都是無一無二的,而且這運算是不可逆的(無法從digest反推回原本的內容 這很重要!! 發明這種演算法的真是天才)


這邊看到的 ”c464ac739be5f332f5991adc5d731019” 就是透過MD5這種hash algorithm所算出的digest

參考網頁:
[1] http://david50.pixnet.net/blog/post/28798505-%5B%E7%AD%86%E8%A8%98%5Ddigital-signature-%E6%95%B8%E4%BD%8D%E7%B0%BD%E7%AB%A0

2015年6月9日 星期二

C語言 - how to check big or little endian

Q: big endian vs little endian, how to check ?

sample code:
int main(void)
{
    short int a = 0x1234;
    char *p = (char *)&a;
   
    printf("p=%#hhx\n",*p);

    if(*p == 0x34)
        printf("Little endian \n");
    else if(*p == 0x12)
        printf("Big endian \n");
    else
        printf("Unknow endian \n");

    return 0;
}

C語言 - sizeof(), strlen()


static void tim_test(void)
{
    char str1[]="12345\n";
    char *p1=str1;

    UINT8 a,b,c,d,e;

    a=sizeof(str1);
    b=sizeof(p1);
    c=sizeof(*p1);

    d=strlen(str1);
    e=strlen(p1);

    libc_printf("%s(): a=%u, b=%u, c=%u, d=%u, e=%u \n",__FUNCTION__,a,b,c,d,e);
 
}

/*
sizeof(str1)=? 7  ("有"包括terminated null character)
sizeof(p1)=?  4 (指標變數)
sizeof(*p1)=? 1   char型態的指標 1 byte
*/

--
程式輸出:
tim_test(): a=7, b=4, c=1, d=6, e=6

C語言 - printf str pointer

void tim_test_str_printf(void)
{
    char *str = "abcde";

    libc_printf("%s(): str = %s, *str=%c \n",__FUNCTION__,str,*str);

}

/*
*str --> 1 byte, char型態的指標
%s: 印出string
%c: 印出一個character
*/


程式輸出:
tim_test_str_printf(): str = abcde, *str=a

--
面試被問到 紀錄一下

2014年3月22日 星期六

secure coding

最近公司在推行這個,雖然很煩瑣,但其實有些不錯又常常忽略導致埋下不定時炸彈小地方值得注意. 整理好來分享下好了