Windows 7'de bir dosyanın ikili içeriğini yerel olarak nasıl görüntüleyebilirim? (Mümkün mü.)


35

500 MB'tan biraz daha büyük bir dosya var ve bu da bazı sorunlara neden oluyor.

Meselenin kullanılan hattın (EOL) sözleşmesinin sonunda olduğuna inanıyorum. Dosyanın EOL kuralını doğrulamak için dosyaya yorumlanmamış ham formunda (1) bakmak istiyorum.

Windows 7'de yerleşik bir şey kullanarak bir dosyanın "ikili" sini nasıl görebilirim? Ek bir şey indirmekten kaçınmayı tercih ederim.

(1) İş arkadaşım ve ben dosyayı metin editörlerinde açtık ve satırları beklendiği gibi gösteriyorlar. Ancak her iki metin editörü de farklı EOL kurallarına sahip dosyaları açacak ve bunları otomatik olarak yorumlayacaktır. (TextEdit ve Emacs 24.2. Emacs head -c4096için, linux kutusunu kullanarak sadece ilk 4K baytlık ikinci bir dosya oluşturdum ve bunu pencere kutumdan açtım.

Emacs'da hexl-modunu kullanmaya çalıştım, fakat hexl-mod ve text-mode'a döndüğümde, tamponun içeriği değişti ve her satırın sonuna görünür bir ^ M ekledi. şu anda buna güveniyorum.

Sorunun kullanılan satır karakterlerinin sonunda olabileceğine inanıyorum. Editörüm çalışma arkadaşım ve ben (1) denedim, sadece satır sözleşmesinin sonunu otomatik olarak tanıdım ve bize satırları gösterdi. Ve diğer kanıtlara dayanarak, EOL kongresinin sadece satırbaşının olduğuna inanıyorum. (2) sadece iade.

Dosyada gerçekte ne olduğunu bilmek için, ondalık ya da sekizlikle çalışabildiğim halde, dosyanın ikili içeriğine ya da en azından birkaç bin baytlık dosyaya bakmak istiyorum. Sadece bir sıfır olanlara bakmak oldukça zor olurdu.

GÜNCELLEŞTİRME

Bunu önerenin dışında, DEBUGaşağıdaki cevapların tümü bir dereceye kadar işe yarayacak. Her birine yardımcı olarak oy verdim. Sorum yanlış oluşturuldu. Önerilen her bir çözümü sınarken, gerçekten yan yana hex ve metin içeriğinin görüntülenmesini istediğimi ve imleci bir bayt değeri veya metin karakteri üzerinde eşleşen şeyin üzerine getirdiğim bir şey olmasını istedim. diğer taraf vurgulanacaktı.

Aslında Emacs hexl-mode "düzgün" çalışmaya başladığında sorunumu çözdüm. Bu yüzden bu cevapların hiçbirini kullanmamaya karar verdim, sadece onları test ettim. (Gerçekten garip Emacs davranışını araştırmalı ve hata raporu vermelidir.)


Muhtemelen Cygwin altında bir çeşit araç var, ancak bu Cygwin'in kurulumunu gerektiriyor. Veya, örneğin, kutunuza Java yüklüyse, Java’ya altıgen bir döküm programı yazmak oldukça basit bir iş olacaktır.
Daniel R Hicks

Yanıtlar:


11

Bir "hex editör" e ihtiyacınız var. Yıllardır "Hex Editor Neo" kullandım ve çok iyi. Bu kullanılabildiğine ücretsiz ve ücretli sürümleri . (Eminim benzer başka araçlar da vardır.)


4
Nasıl olduğunu sormuştum, Windows 7 dışında herhangi bir şey olmadan çünkü ek programlar eklemekten hoşlanmıyorum çünkü 1) Birçoğu, sahip olduğum haklara izin vermeyecek şekilde kuruyor. 2) Bazıları tehlikeli görünüyor. Bu Hex Editor Neo iyi bir öneri gibi görünüyor dedi. +1
Shannon Severance

1
zblist.com , kurulması gerekmeyen veya özel haklara ihtiyaç duymayan, bir Alt-H veya hex moduna sahip bağımsız bir programdır
sgmoore

Belirtilen, hatalı, kaydedilmemiş dahil tüm gereksinimlerimi karşıladım. Hex Editor Neo da hızlıydı ve alet çantama eklendi.
Shannon Severance,

1. Diğer editörler yerli değil. 2. Dosya yöneticileri bu amaç için iyidir ve çevresinde taşınabilir olan pek çok şey vardır. 3. Type komutu, içeriği doğal olarak görüntüleyebilir ve kullanışlı filtrelere sahiptir (sayfa sayfa gibi).
Olağanüstü Zeka

37

Powershell sürüm 5.0 veya daha yenisi varsa, powershellyerleşik işlevi kullanabilirsiniz.Format-Hex

PS:21 C:\Temp >Format-Hex application.exe

            0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F

00000000   42 4D 5E 00 00 00 00 00 00 00 36 00 00 00 28 00  BM^.......6...(. 
00000010   00 00 0A 00 00 00 01 00 00 00 01 00 20 00 00 00  ............ ... 
00000020   00 00 00 00 00 00 C4 0E 00 00 C4 0E 00 00 00 00  ......Ä...Ä..... 
00000030   00 00 00 00 00 00 B7 59 71 FF B7 59 71 FF B7 59  ......•Yq.•Yq.•Y 
00000040   71 FF B7 59 71 FF B7 59 71 FF B7 59 71 FF B7 59  q.•Yq.•Yq.•Yq.•Y 
00000050   71 FF B7 59 71 FF B7 59 71 FF B7 59 71 FF        q.•Yq.•Yq.•Yq.

4
Açıkçası bunun en iyi cevap olmadığını şaşırdım. Bu, pencerelerde yerleşik bir araç kullanarak yapmanın doğru yoludur. Çıktıyı bir dosyaya yazmak istiyorsanız,> Format-Hex application.exe> ​​out.txt
techdude

Bu güzel görünüyor, ancak Format-HexPowerShell'imde mevcut değil; "
Tanınmayan

JamieSee'ye göre, görünüşte powershell 5.0'a kadar eklenmemiş.
Techdude

26

Dahili, hızlı ve kirli: Başlat powershell, çalıştır:

gc -encoding byte -TotalCount 100 "your_file_path" |% {write-host ("{0:x}" -f $_) -noNewline " "}; write-host   

TotalCount , dosyadan okumak istediğiniz bayt sayısıdır.

Google 'powershell hexdump' çok daha parlak / uygulanabilir sürümleri almak için.

Windows Kaynak Seti Araçları'nız varsa (tam olarak yerleşik değil, ancak yakın), ayrıca bir cmd satırı yardımcı programı da kullanabilirsiniz list.exe. Bu hex modu ile küçük bir editör. Özellikle büyük dosyalarla çalışacak şekilde tasarlanmıştır:

Liste Metin Dosyası Aracı (Liste), bir veya daha fazla metin dosyasını görüntüleyen ve arayan bir komut satırı aracıdır. Diğer metin görüntüleme araçlarının aksine, List, dosyayı açtığınızda tüm dosyayı belleğe okumaz. Bir kullanıcının onaltılık biçimde bir metin dosyasını düzenlemesini sağlar.

Liste, metin veya günlük dosyalarını uzaktan görüntülemek ve yöneticilerin sistem performansının düşmesinden endişe duyduğu sunucularda kullanmak için kullanışlıdır.


1
Şimdiye kadar, bu çözüm istediğim en yakın çözüm.
Shannon Severance

1
Güzel, basit, çoktan kurulu. 0x0A'yı "0A" olarak göstermeye zorlamak için "-0: X2}" ("{0: X2}") biçimini değiştirerek 0x0A'yı "0A" olarak göstermeye
zorladım

1
List.exe mükemmeldi - list.exe /?yardım komutu fazla bilgi vermiyor, ancak bir kez editörün içinde sadece ?komutları görmek için çarptı . HHex editörünü açar ve Hex'in F1görüntülenme şeklini değiştirir
Coruscate5

7

Bu aynı zamanda XP sonrası her şeyde çalışır:

certutil -encodehex MyProgram.exe MyProgram.txt

XP, buradan Windows Server 2003 Yönetimsel Araçlar Paketi'ni gerektirir:

https://www.microsoft.com/en-us/download/details.aspx?id=16770


Windows'taki en taşınabilir ve arkada karşılaştırılabilir çözüm, Windows toplu komut dosyalarından bile kullanılabilir, bunun neden hala tüm cevapların tepesinde olmadığına şaşırdım
Andry

6

Dosyayı .COM, taban adının sekiz karakterden uzun olmadığı uzantıya sahip bir isme kopyalayın . Koşmak

DEBUG dosya_adiniz

Bir ' -' istemi verecektir . tip

DEnter

d tuşuna art arda 128 bayt bir anda oynatılır. tip

D adres Enter

adresin başında başlayan ve dosyanın başında 100 adres olan onaltılık yazılan 128 bayt görüntülemek için

D adres 1 adres 2 Enter

dan görüntülemek için adres 1 için adres 2 . tip

D adres Lnum Enter

adresten başlayarak num bayt (uzunluk) görüntülemek için .  num ayrıca hex cinsinden girilir. Çıkmak için kullanın .Q

Örneğin,

C:\Users\scott\Documents> debug thispost.com
-d
0BE4:0100  43 6F 70 79 20 74 68 65-20 66 69 6C 65 20 74 6F   Copy the file to
0BE4:0110  20 61 20 6E 61 6D 65 20-77 69 74 68 20 61 20 2E    a name with a .
0BE4:0120  43 4F 4D 20 65 78 74 65-6E 73 69 6F 6E 2C 20 77   COM extension, w
0BE4:0130  68 65 72 65 20 74 68 65-20 62 61 73 65 20 6E 61   here the base na
0BE4:0140  6D 65 20 69 73 20 6E 6F-20 6C 6F 6E 67 65 72 20   me is no longer
0BE4:0150  74 68 61 6E 20 65 69 67-68 74 20 63 68 61 72 61   than eight chara
0BE4:0160  63 74 65 72 73 2E 0D 0A-52 75 6E 20 44 45 42 55   cters...Run DEBU
0BE4:0170  47 20 2A 79 6F 75 72 5F-66 69 6C 65 6E 61 6D 65   G *your_filename
-d
0BE4:0180  2A 0D 0A 49 74 20 77 69-6C 6C 20 67 69 76 65 20   *..It will give
0BE4:0190  61 20 27 2D 27 20 70 72-6F 6D 70 74 2E 0D 0A 54   a '-' prompt...T
0BE4:01A0  79 70 65 20 44 20 45 6E-74 65 72 20 72 65 70 65   ype D Enter repe
0BE4:01B0  61 74 65 64 6C 79 20 74-6F 20 2A 2A 64 2A 2A 69   atedly to **d**i
0BE4:01C0  73 70 6C 61 79 20 74 68-65 20 66 69 6C 65 20 31   splay the file 1
0BE4:01D0  32 38 20 62 79 74 65 73-20 61 74 20 61 20 74 69   28 bytes at a ti
0BE4:01E0  6D 65 2E 0D 0A 54 79 70-65 20 44 20 5F 61 64 64   me...Type D _add
0BE4:01F0  72 65 73 73 5F 20 74 6F-20 64 69 73 70 6C 61 79   ress_ to display
-d 200 L16
0BE4:0200  20 31 32 38 20 62 79 74-65 73 20 73 74 61 72 74    128 bytes start
0BE4:0210  69 6E 67 20 61 74                                 ing at
-

3
Ne yazık ki, dosya yaklaşık 64 KB'den büyükse, bir .COM için maks. (100 saat ofsetten başlayarak segmente sığmalıdır.)
Ken

1
C:\>attrib debug.exe /s. Sonuçlar: File not found - debug.exe. Resmi bulamadı, hata ayıklama artık desteklenen bir ifade değil, ancak web'de gördüğümden beri hata ayıklama desteği bir süre önce bırakılmış gibi görünüyor. DebugDiag'i Microsoft'tan buldum. (Ekstra indirme.) Hata ayıklama? Belki de HEX'teki dosyalara bakmayı destekler? Bir .MSI dosyası olarak teslim edilir. Yüklemek için yönetici şifresi gerekiyor. Ben bir değilim
Shannon Severance

@Ken head -c4096 bigFileName > smallFileNameDosyaların ilk 4 KB'sini almak için zaten Linux üzerinde kullanmıştı . Çizgiler, dört KB'nin amaçlarıma göre bol miktarda çizgileri olacak kadar küçüktür
Shannon Severance

Öyleyse neden hexdump -CLinux'ta kullanmıyorsunuz ?
Ken

3
@Shannon hata ayıklama DOS'un bir parçasıdır ve x64 kullanıyorsanız, orada değil.
kinokijuf



2

Bu ideal değildir, ancak gerçekten bir şey indirmek istemiyorsanız, o zaman bu dosyayı tamamen farklı bir dosyayla karşılaştırmak için fc / b (yani ikili dosya modunda dosya karşılaştırması) özelliğini kullanmayı deneyebilirsiniz. Farklı olan her baytın değerleri. İki dosyada aynı olacak bazı değerleri elde edersiniz ve çıktıdan atlanabilirler, ancak bunun ofset sütunundaki eksik değerleri kontrol ederek olup olmadığını anlayabilirsiniz.


İdeal değil, ancak bunu 0x00 baytlık bir dosya oluşturarak yapabildim ve sonra bununla karşılaştırabildim. Baktığım ve 0a ve 0d ile ilgilendiğim ve karşılaştırma çalıştığı için boş bir dosya olan ilgilendiğim bir metin dosyası olmak. Fakat hem karakter görünümünü hem de altıgen görünümünü yan yana bulmamı istediğim yerde daha sert görünmek istemiyor. (Hata ayıklama Scott'ın cevabında ve Emacs'in hexl-mode'unda olduğu gibi. Yan yana görünmemi istemedim, ama aslında hex hex'leri nasıl kullandığım için çok önemliydi.)
Shannon Severance

2

Aşağıdaki PowerShell işlevini, dosya içeriğinin altıgen bir dökümünü görmek için Get-Content ile birlikte kullanabilirsiniz Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump. 222 KB'lık bir dosyayı dökmek yaklaşık 23 saniye sürer ve istenirse, dökümü incelemeyi kolaylaştırmak için çıktı bir metin dosyasına yönlendirilebilir.

$encodingAutoCompleter = {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
    $availableEncodings = ([System.Text.Encoding]::GetEncodings() | Select Name, CodePage, DisplayName) + @( [PSCustomObject] @{ CodePage = '20127'; Name = 'ascii'; DisplayName = 'US-ASCII' }, [PSCustomObject] @{ CodePage = '1200'; Name = 'unicode'; DisplayName = 'Unicode' } )
    $availableEncodings | ?{ $_.Name.StartsWith($wordToComplete) } | %{ New-Object System.Management.Automation.CompletionResult -ArgumentList $_.Name, $_.Name, 'ParameterValue', "$($_.DisplayName). Code Page $($_.CodePage)." }
}

function Format-BufferText([byte[]] $buffer, [System.Text.Encoding] $displayEncoding, [switch] $useControlPictures)
{
    $bufferChars = $displayEncoding.GetChars($buffer);
    $bufferText = (($bufferChars | %{ if ([char]::IsControl($_) -eq $true) { if ($useControlPictures -eq $false) { '.' } else { [char] ($_.ToInt16([cultureinfo]::InvariantCulture) + 0x2400) } } else { "$_" } }) -join "")

    $bufferText
}

<#
    .Synopsis
    Displays binary data as a hexadecimal dump.

    .Description
     Displays binary data as a hexadecimal dump. Options are available to suppress displaying text and to display control characters 
     as Unicode Control Pictures instead of dots.

    .Parameter Bytes
    The bytes to be displayed.

    .Parameter Encoding
    The name of the text encoding to use. The default is ascii.

    .Parameter NoTextDisplay
    If specified the text display sidebar will be suppressed; otherwise, the display text sidebar will be present.

    .Parameter UseControlPictures
    If specified control characters will be displayed as Unicode Control pictures; otherwise, dots are used to represent control 
    characters.

    .Example
    Format-HexDump -Encoding unicode $bytes

    .Example
    Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump -Encoding unicode

    .Example
    0..255 | Format-HexDump -NoTextDisplay
#>
function Format-HexDump
{
    [CmdletBinding()]
    param
    (
        [Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [byte[]] $Bytes,
        [ValidateScript({ if (([System.Text.Encoding]::GetEncodings().Name + @('unicode', 'ascii')) -icontains $_) { return $true } else { Throw "Encoding must be one of the following: $([System.Text.Encoding]::GetEncodings().Name -join ', '), unicode, or ascii." } })]
        [Parameter(ValueFromPipeline = $false)]
        [string] $Encoding = "ASCII",
        [Parameter()]
        [switch] $NoTextDisplay,
        [Parameter()]
        [switch] $UseControlPictures
    )

    BEGIN
    {
        $displayEncoding = [System.Text.Encoding]::GetEncoding($Encoding)

        $counter = 0
        $hexRow = ""
        [byte[]] $buffer = @()
    }

    PROCESS
    {
        foreach ($byte in $Bytes)
        {
            $buffer += $byte
            $hexValue = $byte.ToString("X2")

            if ($counter % 16 -eq 0)
            {
                $buffer = @($byte)
                $hexRow = "$($counter.ToString("X8")): $($hexValue) "
            }
            elseif ($counter % 16 -eq 15)
            {
                if ($NoTextDisplay -eq $true)
                {
                    $hexRow += "$($hexValue)"
                    $hexRow
                }
                else
                {
                    $bufferText = Format-BufferText $buffer $displayEncoding $UseControlPictures
                    $hexRow += "$($hexValue)   $($bufferText)"
                    $hexRow
                }
            }
            else
            {
                $hexRow += "$($hexValue) "
            }

            $counter++
        }
    }

    END
    {
        $counter--

        if ($counter % 16 -ne 15)
        {
            $hexRow += " " * (((16 - $counter % 16) * 3) - 1)

            if ($NoTextDisplay -eq $false)
            {
                $bufferText = Format-BufferText $buffer $displayEncoding $UseControlPictures
                $hexRow += "$($bufferText)"
            }

            $hexRow
        }
    }
}

Register-ArgumentCompleter -CommandName Format-HexDump -ParameterName Encoding -ScriptBlock $encodingAutoCompleter

Çıktı şöyle görünür:

00000000: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   ................
00000010: 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F   ................
00000020: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F    !"#$%&'()*+,-./
00000030: 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F   0123456789:;<=>?
00000040: 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F   @ABCDEFGHIJKLMNO
00000050: 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F   PQRSTUVWXYZ[\]^_
00000060: 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F   `abcdefghijklmno
00000070: 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F   pqrstuvwxyz{|}~.
00000080: 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F   ????????????????
00000090: 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F   ????????????????
000000A0: A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF   ????????????????
000000B0: B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF   ????????????????
000000C0: C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF   ????????????????
000000D0: D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF   ????????????????
000000E0: E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF   ????????????????
000000F0: F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF   ????????????????

Veya yalnızca Format-Hex dosya
adını

@techdude Format-Hex, PowerShell'in tüm sürümlerinde mevcut değildir. PowerShell 4 ve daha önceki sürümlerde mevcut değildir. Format-Hex mevcut olmadan önce bu kodu yazdım.
JamieSee

Bu ikili dosyaya geri nasıl?
Zimba


0

Emac kullandığını biliyorum, ancak Vim kullanıcıları xxdyardımcı programı kullanabilir :

xxd -s <start_offset> -l <length_offest> <file>

yani

Usage:
       xxd.exe [options] [infile [outfile]]
    or
       xxd.exe -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]
Options:
    -a          toggle autoskip: A single '*' replaces nul-lines. Default off.
    -b          binary digit dump (incompatible with -ps,-i,-r). Default hex.
    -c cols     format <cols> octets per line. Default 16 (-i: 12, -ps: 30).
    -E          show characters in EBCDIC. Default ASCII.
    -g          number of octets per group in normal output. Default 2.
    -h          print this summary.
    -i          output in C include file style.
    -l len      stop after <len> octets.
    -ps         output in postscript plain hexdump style.
    -r          reverse operation: convert (or patch) hexdump into binary.
    -r -s off   revert with <off> added to file positions found in hexdump.
    -s [+][-]seek  start at <seek> bytes abs. (or +: rel.) infile offset.
    -u          use upper case hex letters.
    -v          show version: "xxd V1.10 27oct98 by Juergen Weigert (Win32)".
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.