2011-07-22 72 views
13

我試圖使用命令行儘可能高效地將十六進制中的「Hello」轉換爲48 65 6c 6c 6f在命令行上將字符串轉換爲十六進制

我試過看printf和谷歌,但我不能得到任何地方。

任何幫助非常感謝。

很多感謝,

+0

什麼操作系統?有很多「命令行」... – Nemo

+0

你看過這裏:http://www.commandlinefu.com/commands/view/6066/convert-ascii-string-to-hex和這裏:http:// stackoverflow.com/questions/2103698/dos-command-to-format-string-to-hex-value? – Mrchief

+0

@Nemo我在Ubuntu Linux上...... – Eamorr

回答

30
echo -n "Hello" | od -A n -t x1 

說明:

  • echo方案將提供該字符串的下一個命令。
  • -n標誌告訴echo不會在「Hello」的末尾生成新行。
  • od程序是「八進制轉儲」程序。 (我們將提供一個標誌,告訴它將其轉儲爲十六進制而不是八進制。)
  • -A n標誌是--address-radix=n的縮寫,其中n是「none」的縮寫。如果沒有這部分,該命令會在左側輸出一個醜陋的數字地址前綴。這對於大型轉儲很有用,但對於短字符串來說,這是不必要的。
  • -t x1標誌是--format=x1的縮寫,x是「十六進制」的縮寫,1是1字節。
+0

嘿,這真的很好。你有沒有機會知道擺脫空間的方法? – Eamorr

+2

echo -n「Hello」| od -A n -t x1 | sed's/^ * //' – TMS

+0

我相信你的意思是 echo -n「你好」| od -A n -t x1 | sed's/* // g' – ndvo

1

不出所料,@TMS不能RTFM。 (見他的評論是他以前的答案)

如果你想這樣做,並刪除您需要的空間:

echo -n "Hello" | od -A n -t x1 | sed 's/ *//g' 

前兩個管道中的命令深受@TMS在他的回答解釋說,由@James編輯。最後的命令不同於@TMS評論,因爲它是正確的並且已經過測試。對此的解釋是:

  • sed小號 tream itor。
  • ss ubstitute命令。
  • /打開正則表達式 - 可以使用任何字符。 /是 常規,但不便處理,例如XML或路徑名稱。
  • /或您選擇的替代字符,關閉正則表達式,並打開替換字符串 。
  • / */*匹配前一個字符的任何序列(在這個 的情況下,一個空格)。
  • /或您選擇的替代字符將關閉替換字符串。 在這種情況下,替換字符串//是空的,即刪除了匹配 。
  • g是做這個替換的選項g每條線上的葉片代替 只有一行。
  • 引號使命令解析器不會感到困惑 - 整個 序列作爲第一個選項傳遞給sed,即sed腳本。

@TMS腦兒(sed 's/^ *//')只從各行的開始剝離空間(^行的開頭匹配 - 在sed -speak「模式空間」)。

如果您還想要刪除換行符,最簡單的方法是將追加

| tr -d '\n' 

到命令管道。它的功能如下:

  • |將先前處理的流饋送到此命令的標準輸入。
  • trtr anslate命令。
  • -d指定刪除匹配字符。
  • 行情列出您的匹配字符 - 在這種情況下只是換行符(\n)。 翻譯只匹配單個字符,而不是序列。

sed在處理換行符時是唯一延遲的。這是因爲sed是最古老的unix命令之一 - 它是在人們真正知道他們在做什麼之前創建的。普及的傳統軟件使它不被修復。我知道這是因爲我出生之前unix出生。

問題的歷史淵源在於新行是行分隔符,而不是行的一部分。因此它被行處理實用程序剝離並由輸出實用程序重新插入。麻煩在於,這會對用戶數據的結構做出假設,並在許多設置中施加不自然的限制。 sed無法輕易去除換行符是導致悲傷的畸形的意識形態最常見的例子之一。

可以使用sed刪除換行符 - 只是我知道的所有解決方案讓sed立刻處理整個文件,這些文件阻塞了非常大的文件,從而破壞了流編輯器的用途。如果可能的話,任何保留線處理的解決方案都將是一個不可讀的鼠標套管。

如果你堅持要用sed嘗試:

sed -z 's/\n//g' 

-z告訴sed使用空值作爲行分隔符。

在內部,C中的字符串以null結尾。 -z選項也是傳統的結果,爲方便C程序員提供,他們可能喜歡使用填充了C-字符串的臨時文件,並使用換行符進行整理。然後,他們可以一次輕鬆讀取和處理一個字符串。同樣,關於用例的早期假設對用戶數據施加了人爲限制。

如果您省略g選項,則此命令僅刪除第一個換行符。使用-z選項sed將整個文件解釋爲一行(除非文件中嵌入了零星空洞),以null結尾並因此也會在大文件上扼殺。

你可能會認爲

sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//' 

可能會奏效。第一個命令在每行的前面放置一個空行,導致每行結尾爲\n\x00。第二條命令從每行刪除一條新行,現在由空值分隔 - 由於第一條命令將只有一條換行符。剩下的只是虛假的空值。到現在爲止還挺好。這裏的錯誤思想是管道將逐行饋送最後的命令,因爲這是流的構建方式。實際上,寫入的最後一個命令只會刪除一個null,因爲現在整個文件沒有換行符,因此只有一行。

簡單管道實現使用一箇中間臨時文件,並處理所有輸入並將其提供給該文件。下一個命令可能在另一個線程中運行,同時讀取該文件,但它只是將整個流視爲一個整體(雖然不完整),並且沒有意識到輸入文件的塊邊界。即使管道是內存緩衝區,下一個命令也會將該流視爲一個整體。缺陷被不可分割地烘焙成sed

要使此方法有效,最後一條命令需要g選項,所以它再次在大文件上扼流。

底線是這樣的:不要使用sed來處理換行符。

+0

OMG你真棒! – TMS

相關問題