Windows 7에서 기본적으로 파일의 이진 내용을 보려면 어떻게해야합니까? (가능합니다.)


35

500MB보다 약간 큰 파일이 있는데 문제가 있습니다.

문제가 사용 된 EOL (End of Line) 규칙에 있다고 생각합니다. 해석되지 않은 원시 형식 (1)으로 파일을보고 파일의 EOL 규칙을 확인하고 싶습니다.

Windows 7에 내장 된 것을 사용하여 파일의 "이진"을 보려면 어떻게해야합니까? 추가 항목을 다운로드하지 않아도됩니다.

(1) 동료와 나는 파일을 텍스트 편집기에서 열었고 예상대로 줄을 표시합니다. 그러나 두 텍스트 편집기는 서로 다른 EOL 규칙이있는 파일을 열고 자동으로 해석합니다. (TextEdit 및 Emacs 24.2. Emacs의 head -c4096경우 Linux 상자 에서 첫 4K 바이트 만 사용하여 두 번째 파일을 작성하고 Windows 상자에서 파일을 열었습니다.

Emacs에서 hexl-mode를 사용하려고했지만 hexl-mode로 돌아가서 text-mode로 돌아 가면 버퍼의 내용이 변경되어 각 줄의 끝에 보이는 ^ M이 추가되었습니다. 지금은 그것을 신뢰합니다.

문제가 사용 된 줄 끝 문자에 있다고 생각합니다. 동료 편집자와 편집자들은 (1) 자동으로 줄 끝 규칙을 인식하고 줄을 보여주었습니다. 그리고 다른 증거를 바탕으로 나는 EOL 협약이 캐리지 리턴 일 뿐이라고 생각합니다. (2) 반품 만 가능합니다.

실제로 파일에 무엇이 있는지 알기 위해 파일의 이진 내용 또는 적어도 2 천 바이트의 파일을 16 진수로 보길 원하지만 10 진수 또는 8 진수로 작업 할 수는 있습니다. 0으로 보는 것은 꽤 거칠 것입니다.

최신 정보

제안하는 사람을 제외하고 DEBUG아래의 모든 답변은 어느 정도 작동합니다. 나는 도움이되는 사람들을 각각 투표했습니다. 내 질문은 틀렸다. 제안 된 각 솔루션을 테스트 할 때 실제로 나란히 16 진수 및 텍스트 내용을보고 싶었고 바이트 값이나 텍스트 문자, 커서, 다른 쪽이 강조 표시됩니다.

나는 Emacs hexl-mode가 "정확하게"작동하기 시작할 때 실제로 내 문제를 해결했다. 그래서 나는이 답변 중 하나를 사용하지 않고 테스트 만했습니다. (정말 이상한 Emacs 동작을 조사하고 버그 보고서를 제출해야합니다.)


Cygwin에는 일종의 도구가있을 수 있지만 Cygwin을 설치해야합니다. 또는 상자에 Java를 설치 한 경우 16 진 덤프 프로그램을 Java로 작성하는 것은 매우 간단한 작업입니다.
Daniel R은

답변:


11

"16 진 편집기"가 필요합니다. 나는 "Hex Editor Neo"를 몇 년 동안 사용해 왔으며 매우 좋습니다. 이 글은 가능한 무료 및 유료 버전 . (그리고 다른 유사한 도구를 사용할 수 있다고 확신합니다.)


4
나는 프로그램을 추가하는 것을 좋아하지 않기 때문에 Windows 7 이외의 다른 방법없이 어떻게 물 었는지 물었다. 2) 어떤 사람들은 피하다 보인다. Hex Editor Neo는 좋은 추천으로 보입니다. +1
Shannon Severance 1

1
zblist.com 은 독립형 프로그램으로 설치하거나 특별한 권한이 필요하지 않으며 Alt-H 또는 16 진 모드를 가지고 있습니다
sgmoore

진술, 누락, 언급되지 않은 모든 요구 사항을 충족했습니다. Hex Editor Neo도 빠르며 툴백에 추가되었습니다.
섀넌 세브란스

1. 다른 편집자는 원어민이 아닙니다. 2. 파일 관리자는이 목적에 적합하며 이식성이 뛰어납니다. 3. type 명령은 내용을 기본적으로 표시 할 수 있으며 유용한 필터 (페이지 별)가 있습니다.
Overmind

37

Powershell 버전 5.0 이상이있는 경우 powershell내장 기능을 사용할 수 있습니다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
이것이 정답이 아니라는 것에 솔직히 놀랐습니다. 이것은 Windows의 내장 도구를 사용하여 올바른 방법입니다. 출력을 파일에 쓰려면> Format-Hex application.exe> ​​out.txt
techdude를

이것은 훌륭해 보이지만 Format-HexPowerShell에서는 사용할 수 없습니다. 난 그냥 "인식되지"오류 얻을
Kidburla

JamieSee에 따르면 powershell 5.0까지 추가되지 않은 것 같습니다.
techdude

26

내장, 빠르고 더러운 : 시작 powershell, 실행 :

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

TotalCount 는 파일에서 읽으려는 바이트 수입니다.

훨씬 더 세련되고 실행 가능한 버전을 얻으려면 Google 'powershell hexdump'.

Windows Resource Kit 도구 (정확히 내장되어 있지는 않지만 닫기)가있는 경우라는 cmd line 유틸리티를 사용할 수도 있습니다 list.exe. 16 진 모드의 작은 편집기입니다. 큰 파일 작업을 위해 특별히 설계되었습니다.

텍스트 파일 목록 도구 (목록)는 하나 이상의 텍스트 파일을 표시하고 검색하는 명령 줄 도구입니다. 다른 텍스트 표시 도구와 달리 List는 파일을 열 때 전체 파일을 메모리로 읽지 않습니다. 텍스트 파일을 16 진수 형식으로 편집 할 수 있습니다.

목록은 텍스트 또는 로그 파일을 원격으로 표시하고 관리자가 시스템 성능 저하를 우려하는 서버에서 사용하는 데 유용합니다.


1
지금 까지이 솔루션은 내가 요구 한 것 중 가장 가깝습니다.
섀넌 세브란스

1
훌륭하고 간단하며 이미 설치되어 있습니다. 나는 쓰기 호스트 (에 형식을 변경 : "0A"없습니다 "A"로 표시 0x0A를 강제로 "{0 X2}"2 2 자리, 상부 케이스에 대한 그것 때문에 얼마나 좋아 I
아담 Straughan

1
List.exe는 완벽했습니다. list.exe /?help 명령은 많은 정보를 제공하지 않지만 일단 편집기 내부에서 ?명령을 보려면 누르십시오 . H16 진수 편집기를 열고 16 진수 F1표시 방식을 전환합니다
Coruscate5

7

이것은 XP 이후의 모든 작업에서도 작동합니다.

certutil -encodehex MyProgram.exe MyProgram.txt

XP에는 Windows Server 2003 관리 도구 팩이 필요합니다.

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


Windows에서 가장 휴대 성이 뛰어나고 호환 가능한 솔루션은 Windows 배치 스크립트에서도 사용할 수 있습니다. 왜 이것이 여전히 모든 답변의 최상위에 있지
않습니까?

6

.COM기본 이름이 8자를 넘지 않는 확장명 을 가진 이름으로 파일을 복사하십시오 . 운영

DEBUG your_filename

' -'프롬프트가 표시됩니다. 유형

DEnter

반복적으로 D 한번에 isplay 파일 128 바이트. 유형

D 주소 Enter

address 에서 시작하여 128 바이트를 표시 하려면 16 진수로 입력해야합니다. 여기서 파일의 시작은 주소 100입니다.

D 주소 1 주소 2 Enter

주소 1 에서 주소 2 로 표시 합니다. 유형

D 주소 L번호 Enter

address 에서 시작하는 num 바이트 (길이) 를 표시 합니다숫자 도 16 진수로 입력됩니다. Q종료하는 데 사용 합니다.

예를 들어

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
불행히도 파일이 .COM의 최대 크기 인 약 64KB보다 크면 작동하지 않습니다. (오프셋 100h에서 시작하는 세그먼트에 맞아야합니다.)
Ken

1
C:\>attrib debug.exe /s. 결과 :File not found - debug.exe . 공식을 찾을 수 없었지만 디버그는 더 이상 지원되지 않습니다 .하지만 웹에서 보았을 때 디버그 지원이 잠시 중단 된 것처럼 보입니다. Microsoft에서 DebugDiag를 찾았습니다. (추가 다운로드) 디버깅 중? 아마도 HEX에서 파일을 볼 수 있습니까? .MSI 파일로 제공됩니다. 설치하려면 관리자 암호가 필요합니다. 나는 하나가 아닙니다.
Shannon Severance

@Ken 나는 이미 head -c4096 bigFileName > smallFileName리눅스에서 파일의 첫 4KB를 얻었습니다. 줄은 4KB가 나의 목적을 위해 충분한 줄을 가질만큼 충분히 작습니다
Shannon Severance

hexdump -CLinux에서 사용하지 않는 이유는 무엇입니까?
Ken

3
@Shannon 디버그는 DOS의 일부이므로 x64를 사용하는 경우에는 없습니다.
kinokijuf


5

Windows 7에는 닷넷 프레임 워크 3.5가 내장되어 있으므로 C # 컴파일러가 내장되어 있으므로 다음과 같은 목록을 얻을 수 있습니다. http://illegalargumentexception.blogspot.co.uk/2008/04/c- file-hex-dump-application.html 을 사용하여 컴파일

  \windows\Microsoft.NET\Framework\v3.5\csc printhex.cs 

16 진수와 ASCII 문자를 모두 표시하는 printhex.exe로 끝나야합니다.


간단하고 거대한 다운로드가 필요하지 않습니다.
live-love

2

이상적이지는 않지만 실제로 다운로드하지 않으려는 경우 fc / b (즉, 이진 모드의 파일 비교)를 사용 하여이 파일을 다른 완전히 다른 파일과 비교하면 16 진수가 표시됩니다 다른 각 바이트의 값. 두 파일에서 동일한 일부 값을 얻을 수 있으므로 출력에서 ​​건너 뛸 수 있지만 오프셋 열에서 누락 된 값을 확인하여 해당 값이 발생하는지 알 수 있습니다.


이상적이지는 않지만 0x00 바이트의 파일을 만든 다음 비교할 수 있습니다. 내가보고있는 텍스트 파일이기 때문에 0a와 0d에 주로 관심이있는 비교 파일로 null 파일에 관심이있었습니다. 그러나 그것은 문자보기와 16 진수보기를 나란히 제공하지 않으므로 내가 더 어려워 보이고 싶은 곳을 찾았습니다. (스캇의 대답과 Emacs의 hexl-mode 에서처럼 디버그는 나란히 보지 않았지만 실제로 16 진 덤프를 사용하는 방법에있어서 매우 중요합니다.)
Shannon Severance

2

Get-Content와 함께 아래의 PowerShell 기능을 사용하여 파일 내용의 16 진 덤프 (예 :)를 볼 수 Get-Content -Encoding Byte 'MyFile.bin' | Format-HexDump있습니다. 222KB 파일을 덤프하는 데 약 23 초가 소요되며 원하는 경우 출력을 텍스트 파일로 재지 정하여 덤프를보다 쉽게 ​​검사 할 수 있습니다.

$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

출력은 다음과 같습니다.

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   ????????????????

또는 Format-Hex 파일 이름을 사용하십시오
techdude

@techdude Format-Hex는 모든 버전의 PowerShell에서 사용할 수 없습니다. PowerShell 4 및 이전 버전에는 존재하지 않습니다. Format-Hex가 존재하기 전에이 코드를 작성했습니다.
JamieSee

이진 파일로 다시 되 돌리는 방법?
짐바


0

Emacs를 사용하고 있지만 Vim 사용자는 xxd유틸리티 를 사용할 수 있습니다 .

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

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)".
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.