1. javascript可以用某種手段編譯成一個二進制可執行文件嗎
你可以把腳本用二進制方式寫進圖片或者視頻里,但是這個東西對於網站的過濾來說,會變得很復雜。加入我在圖片里插入了惡意腳本,你還允許我上傳到伺服器。那伺服器就有可能被我通過那段惡意代碼控制。
你寫好一段js腳本,把它以二進制的方式添加到圖片里,圖片裡面的圖片類型要保留,然後加入/* xxxx */來注釋掉圖片內容。
在<script src=''><script>,src屬性可以指定圖片。
2. 怎麼編譯windows 64位版本的libav
libav是ffmpeg的一個分支,我純粹是出於喜歡avconv和avprobe這樣清晰的命名才對它有好感。
因為官方網站有一個編譯指南,以下只是本人在實際編譯過程中的一些問題點的記錄。
編譯環境准備
因為libav使用configure腳本來編譯,所以必須要安裝mingw的msys,這樣可以有一個bash來運行configure腳本,以及保證一個可用的gnu make來執行編譯。現在安裝Mingw可以使用mingw-get,培嫌類似於一個包管理器,我們只需要msys的包和coreutils的ext包就可以了。
其次我使用VS2013 Express版本的msvc來編譯。在之前版本的msvc,只需要安裝Windows SDK那個光碟鏡像就可以有一個命令行的編譯環境了,但是VS2013之後,必須安裝VS2013的光碟鏡像才可以(Express版本足矣)。
另外libav中有匯編代碼,語法是yasm,所以得下載一份windows版本的yasm。
依賴的第三方庫准備
我只准備了zlib和libfdk_aac兩個庫,前者其實我不知道libav哪裡用了,只是看到指南中有提及,就下載了,libfdk_aac據說是目前開源界最好的aac編解碼庫,只是因為用了一個custom的license,所以用它編譯出來的二進制文件是禁止發布的,所以想用支持這個庫的libav只能自己編譯用。
按照指南中的說明來修改編譯zlib即可,非常straight forward,只是要編譯一個x64的zlib.lib有需要注意的地方;cl.exe編譯object file的時候是沒有選項來指定要生成32位還是64位的,相反的,它用不同的cl.exe用來實現這一點,使用vs2013的兩個命令行快捷方式開啟編譯環境命令行即可(也就是給vcvarsall.bat傳遞不同的參數來打開相應的編譯環境命令行,例如我安裝的32位的VS2013 Express,就可以用vcvarsall.bat x86_amd64在PATH中准備好一個本身是32位的但生成的目標文件是64bit的cl.exe)。
libfdk_aac的代碼中沒有為msvc的toolchain來准備任何配置,所以我採用的最笨的方法:在VC中新建一個static library類型的工程,然後把需要的文件全部添加進來(除了aac decoder的部分),並且配置各種細節,來生成最後的64位的fdk-aac.lib文件。
configure libav
然後把zlib的頭文件和libfdk_aac的encoder的頭文件放到3rd/headers,把剛才生成的lib放到3rd/libs。正如指南中配譽手說的,msvc的toolchain會使用INCLUDE和LIB兩個環境變數來確定頭文件和庫文件的位置;在打開vcvarsall.bat之後,這兩個變數已經帶了系統庫的設定;而我們需要在./configure和make執行的時候,都要在這兩個變數中加上我們的3rd環境;因為用msys的bash來運行,只需要在這兩個命令前面虛前如此設置即可:
INCLUDE=3rd/headers/;$INCLUDE LIB=3rd/libs/;$LIB ./configure
還有需要刪除mingw的link.exe,避免與msvc中的link.exe沖突,指南中也提到了。
另外附上我的configure參數,因為我的fdk-aac.lib中沒有解碼器,我專門聲明了不使用它的解碼器:
./configure --disable-debug \
--enable-gpl --enable-nonfree \
--enable-runtime-cpudetect \
--disable-avplay --disable-avserver \
--disable-encoder=aac \
--enable-libfdk-aac --disable-decoder=libfdk_aac \
--toolchain=msvc
libav本身的修改和make
libav在windows下,會把通過GetCommandLineW()來獲取UTF-16LE版本的命令行參數,並轉換成UTF-8之後才進行後續的所有操作(libav內部都是用UTF-8來統一對待字元串編碼的);但是在往控制台打log的時候,直接用fputs介面向stderr列印UTF-8的multibyte字元串,在CP_ACP(ANSI codepage)為gbk的中文windows上,字元串中的非ascii字元(例如剛才命令行傳入的中文文件名)就會列印為亂碼(因為系統用GBK來解碼UTF-8的字元串)。
解決方案是:
先用MultiByteToWideChar()把待列印的UTF-8 multibyte字元串轉換回UTF-16LE的wchar_t字元串;
這時候如果用fwputs來列印轉換後的字元串,會發現一遇到非ascii字元就會調用失敗(列印停止),這是因為默認的locale中的LC_TYPE(這個locale category專門控制字元相關的操作的)是"C",用setlocale(LC_TYPE, "")設置為系統默認(中文系統為GBK),或者顯式調用setlocale(LC_TYPE, ".936")設置為GBK,就能成功列印出UTF-16LE中的GBK能表示的字元;
但是這個locale+fwputs的方案只能顯示出一種ANSI方案支持的字元,想顯示出所有UTF-16LE支持的字元,應該直接使用windows的API調用,WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), wcMsg, wcMsgLen, &wcMsgLen, NULL)。
以下是我對libavutil/log.c的patch:
--- log.c 2014-08-04 10:02:34 +0800
+++ libav-64bit/libav-10.3/libavutil/log.c 2014-09-10 06:42:02 +0800
@@ -59,6 +59,10 @@
static void colored_fputs(int level, const char *str)
{
+#if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
+ int wcBufLen = 0;
+ wchar_t* wcBuf = NULL;
+#endif
if (use_color < 0) {
#if HAVE_SETCONSOLETEXTATTRIBUTE
CONSOLE_SCREEN_BUFFER_INFO con_info;
@@ -83,7 +87,19 @@
if (use_color) {
set_color(level);
}
+#if HAVE_COMMANDLINETOARGVW && defined(_WIN32)
+ wcBufLen = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
+ if (wcBufLen == 0) {
+ fputs("Failed to convert multibyte log string to widechar.\n", stderr);
+ exit(1);
+ }
+ wcBuf = (wchar_t*)malloc(wcBufLen *2);
+ wcBufLen = MultiByteToWideChar(CP_UTF8, 0, str, -1, wcBuf, wcBufLen);
+ WriteConsoleW(GetStdHandle(STD_ERROR_HANDLE), wcBuf, wcBufLen, &wcBufLen, NULL);
+ free((void*)wcBuf);
+#else
fputs(str, stderr);
+#endif
if (use_color) {
reset_color();
}
使用avconv的簡易教程
avprobe xxx.mkv
看清音軌是哪個,也就是一個數字音軌號;其實大部分時候一個容器中的所有音軌都是一種格式的,所以其實也不用看,下面用a指定所有的就好了
avconv -i xxx.mkv -c -c:1 libdfk_aac out.mkv
以上把1號軌按照aac重新編碼,別的軌全部對拷
avconv -i xxx.mkv -c -c:a libdfk_aac out.mkv
以上把所有音軌按照aac重新編碼,別的軌全部對拷
avconv -i xxx.mkv -i xxx.srt -c -c:a libdfk_aac out.mkv
以上演示另外附加一個srt,注意所有的-c參數都要放在所有-i文件之後
如何去掉輸入文件中的某些軌呢(需要借鑒avprobe xxx.mkv的輸出了):
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0 out.mkv
以上語句實現功能跟不加-map 0一樣,map 0是說把第0號輸入文件中的所有軌都輸入到out.mkv
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:v out.mkv
以上語句講只輸出視頻軌
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:v -map 0:1 -map 0:s out.mkv
如果輸入文件中0為視頻,1和2均為音頻軌,3和4為字幕軌,以上語句可以只輸出0 1 3軌,不輸出2號音頻軌
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0:0 -map 0:1 -map 0:3 -map 0:4 out.mkv
以上功能相同,只是完全用軌的數字序號來表示
avconv -i xxx.mkv -c -c:a libdfk_aac -map 0 -map -0:2 out.mkv
以上功能相同,只是用「負」來表示從之前形成的map中去掉指定的軌
注意map選項用在輸出之前,所有-i之後
某些文件(例如avi)在remux到mkv的時候會報錯,給avconv加上-fflags +genpts一般能解決
3. 二進制如何編程
1、打開易語言新建一個windows程序進入下圖界面。
4. c語言的編譯過程是什麼
c語言的編譯過程如下:
1、預處理:預處理過程實際上是處理「#」的過程:#include包含的頭文件直接拷貝到hello.c中;#define定義的宏定義進行替換,同時刪除代碼中沒有的注釋部分。2、編譯:編譯的過程實質上是將高級語言翻譯成機器語言的過程。3、匯編:匯編器是將匯編代碼轉變成機器可以執行的命令,每一個匯編語句幾乎都對應一條機器指令。匯編相對於編譯過程比較簡單,根據匯編指令和機器指令的對照表一一翻譯即可。4、鏈接:就像hello.c中使用到了C標准庫的東西「printf」,但是編譯過程只是將源文件翻譯成二進制文件而已,這個二進制文件還不能直接執行,還需要一個動作:將翻譯成的二進制文件與需要用到的庫綁定在一塊。
補充:編譯過程可分為6步:掃描(詞法分析)、語法分析、語義分析、源代碼優化、代碼生成、目標代碼優化。
5. 如何將一個函數編譯成二進制文件
通過下面這條命令,main.c和swap.c 就產生了一個可執行二進制文件swap
》gcc mian.c swap.c -o swap
那麼這條命令是么樣把源程序變成可執行程序的呢?
步驟如下:
1、驅動程序首先調用C預處理器(CPP)把源文件翻譯成一個ASCII中間文件mian.i,預處理器會把#include所包含的內容都插入到聲明的位置,並且做宏替換,把main.c 文件的第3行 的SIZE替換成2(注意這里只是做簡單的文本替換)。
2、接下來驅動程序的C編譯器將main.i翻譯成匯編語言程序main.s
3、然後驅動程序的匯編器將匯編語言程序main.s 翻譯成可重定位的二進制文件main.o
4、最後運行鏈接器將main.o 與swap.o 以及一些必要的系統目標文件(比如你將調用的printf函數就是printf.o)連接起來變成一個可執行的二進制文件。
6. python如何編譯生成二進制文件
用py2exe 打包成可以執行文件
7. c語言是如何編譯成二進制
計算機專業有門課程叫做《編譯原理》,詳細講述了怎麼把高級語言翻譯成匯編語言活著機器能看懂的二進制代碼。
簡單的說,C語言是通過編譯器翻譯成二進制代碼的(就像英譯漢的軟體把英文翻譯成漢語一樣。把高級語言翻譯成機器語言過程很復雜,學了編譯原理就懂了)。還有編譯器可以用各種語言編寫,C語言可以被用C語言寫的編譯器來編譯。
8. C/C++語言編譯生產可執行的二進制文件的過程求大神詳盡解釋,
預編譯。編譯器將你的.c、.cpp源代碼,通過解釋其中的預編譯指令,將源代碼轉換成相應的沒有任何預編譯指令的代碼。
編譯、優化。將上一步的代碼編譯成匯編指令,並作一定優化,形成對應的.s匯編代碼
匯編。將.s文件匯編成機器碼,形成對應的.o目標文件,此時是不可執行的二進制文件。生成對應的清單文件。為了連接需要,還會生成未定向符號表、導出符號表、地址重定向表等等。
連接。先根據對應的清單文件、連接文件及之間的調用關系,決定所有的目標文件及引用的庫文件在最後可執行文件中的位置;然後做一些其他事情,比如根據符號表等將目標文件中的符號地址補全等等;最終得到可執行文件。
這只是我個人的簡單理解,更詳盡的解答都可以寫成好幾本書了=_=望採納~
9. 如何編譯nodejs的二進制模塊
god Buffer類是一個全局的直接處理二進制數據類型。它可以以各種方式構造。 look
sex 純Javascript對於Unicode的處理是友好的,而對二進制並不友好。但處理TCP數據流和文件系統,必須要處理位元組流,所以node.js提供一套策略來創建和操作位元組流。 sex
googog 數據儲存在一個Buffer實例中,一個Buffer的大小是固定的,類似於不可變的整數數組。 good
look Buffer與字元串之間的轉換需要指定明確的編碼。 googog
this Buffer支持的編碼: book
yellow 'ascii'編碼,只為7位的ASCII的數據。這個編碼方法非常快! googog
god 'utf8' 編碼,支持Unicode字元。 yellow
yellow 'utf16le' 編碼,小端編碼的Unicode字元。對(u10000 ~ u10FFFF)的支持。 fuck
book 'ucs2' 是 'utf16le' 編碼的別名。 god
look 'base64' 是 Base64字元串編碼。 this
good 'hex' 表示十六進制編碼,每個byte編碼為兩個十六進制字元。 look
sex 一個Buffer對象也可以使用一個類型數組。Buffer對象克隆到一個ArrayBuffer,用作類型數組存儲支持。node.js提供的Buffer和標准類型化數組是兩套不同的系統,所以Buffer和ArrayBuffer的內存不共享。 sex
sex 注意:雖然V8提供了標准化的類型化數組,但node.js自身定義的Buffer提供了更靈活強大的API,在之後的章節會詳細講解兩者的轉換與使用方法。 good
10. centos 7怎麼安裝編譯安裝二進制文件
安裝軟體包
rpm [option] /path/to/package_file
-i:安裝
-v:顯示安裝詳細信息
-h:以#號顯示安裝進度,每個#號代表2%的安裝進度
組合用法:rpm -ivh /path/to/package_file
--nodeps:安裝時忽略依賴關系。(此方式安裝的軟體可能運行不了)
--test:測試安裝,不是真正的安裝。
--replacepkgs:重新安裝(如果原有配置文件作了修改,很有可能不執行替換,而是將應該安裝生成的配置文件重命名為 .rpmnew)
卸載軟體包
rpm [option] package_name
-e:卸載(如果包的配置文件安裝後曾被改動過,卸載時,此文件將不會卸載,而是被重命名並保留,例如warning: /etc/zprofile saved as /etc/zprofile.rpmsave.)
--nodeps:卸載時忽略依賴關系(卸載後,依賴次軟體包的程序可能無法正常運行)
升級軟體包
rpm [option] /path/to/package_file
-Uvh:升級或安裝,如果舊版本的軟體包不存在,則安裝此軟體包;如果舊的軟體包存在,則升級舊軟體包。
-Fvh:純升級,如果舊版本的軟體包不存在,則不安裝此軟體包;如果舊的軟體包存在,則升級舊軟體包。
注意:不應該對內核執行升級操作,而是安裝。系統允許多內核並存