1. Linux xxd -i 기능
Linux 시스템 xxd 명령은 2진수 또는 16진수 형식을 사용하여 파일 내용을 표시합니다. outfile 매개변수가 지정되지 않으면 결과가 터미널 화면에 표시됩니다. 그렇지 않으면 결과가 outfile로 출력됩니다. 자세한 사용법은 리눅스 명령어 xxd를 참고하세요.
이 글은 주로 xxd 명령의 -i 옵션에 초점을 맞췄습니다. inputfile이라는 C 언어 배열 정의를 출력하려면 이 옵션을 사용하십시오. 예를 들어 echo 12345 > test 및 xxd -i test 명령을 실행하면 출력은 다음과 같습니다.
unsigned char test[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x0a }; unsigned int test_len = 6;
표시되며 배열 이름은 입력 파일입니다. 이름(접미사 이름이 있는 경우 마침표는 밑줄로 대체됩니다.) 0x0a는 개행 문자 LF('n')를 나타냅니다.
2. xxd -i의 일반적인 용도
기기에 파일 시스템이 없거나 동적 메모리를 지원하지 않는 경우 관리 과정에서 바이너리 파일(예: 부트로더 및 펌웨어) 내용이 C 코드 정적 배열 내에 저장되는 경우가 있습니다. 이때 xxd 명령어를 이용하면 버전 배열을 자동으로 생성할 수 있다. 예는 다음과 같습니다.
1) Linux 명령 xdd를 사용하여 바이너리 파일 VdslBooter.bin을 16진수 파일 DslBooter.txt로 변환합니다.
xxd -i
이 중 '-i' 옵션은 출력이 C 포함 파일 스타일(어레이 모드)임을 나타냅니다. 리디렉션 기호 '
2) C 코드 소스 파일에서 해당 정적 배열을 정의합니다.
static const uint8 bootImageArray[] = { #include " ../../DslBooter.txt" }; TargetImage bootImage = { (uint8 *) bootImageArray, sizeof(bootImageArray) / sizeof(bootImageArray[0]) };
소스 코드를 컴파일할 때 DslBooter의 내용은 .txt 파일은 위의 배열로 자동으로 확장됩니다. #include 전처리 지시문을 현명하게 사용하면 배열 내용을 수동으로 복사하는 문제를 피할 수 있습니다.
3. xxd -i 유사 함수의 Python 구현
이 섹션에서는 Python2.7 언어를 사용하여 xxd를 구현합니다. i-like 기능이 작동합니다.
작성자가 학습 단계에 있기 때문에 코드 내에서 다르게 작성되었지만 동일하거나 유사한 기능을 가진 곳이 많으므로 다른 구문 참조를 제공하는 것을 목표로 삼고 있습니다.
먼저 짧지만 완전한 프로그램을 살펴보십시오(xddi.py로 저장):
#!/usr/bin/python #coding=utf-8 #判断是否C语言关键字 CKeywords = ("auto", "break", "case", "char", "const", "continue", "default", "do","double","else","enum","extern","float","for", "goto","if","int","long","register","return","short", "signed","static","sizeof","struct","switch","typedef","union", "unsigned","void","volatile","while", "_Bool") #_Bool为C99新关键字 def IsCKeywords(name): for x in CKeywords: if cmp(x, name) == 0: return True return False if __name__ == '__main__': print IsCKeywords('const') #Xxdi()
이 코드는 주어진 내용을 결정합니다. 문자열이 C 언어 키워드인지 여부입니다. Windows 시스템의 cmd 명령 프롬프트에 E:PyTest>python xxdi.py를 입력하면 실행 결과가 True입니다.
다음 코드 조각은 머리 부분의 스크립트 및 인코딩 선언과 끝 부분의 'main' 섹션을 생략합니다.
C 배열을 생성하기 전에 배열 이름이 올바른지 확인하세요. C 언어 식별자는 문자, 숫자, 밑줄로만 구성될 수 있으며 숫자로 시작할 수 없습니다. 또한 키워드는 식별자로 사용할 수 없습니다. 모든 잘못된 문자를 처리해야 합니다. 규칙은 코드 주석을 참조하세요:
import re def GenerateCArrayName(inFile): #字母数字下划线以外的字符均转为下划线 #'int $=5;'的定义在Gcc 4.1.2可编译通过,但此处仍视为非法标识符 inFile = re.sub('[^0-9a-zA-Z\_]', '_', inFile) #'_'改为''可剔除非法字符 #数字开头加双下划线 if inFile[0].isdigit() == True: inFile = '__' + inFile #若输入文件名为C语言关键字,则将其大写并加下划线后缀作为数组名 #不能仅仅大写或加下划线前,否则易于用户自定义名冲突 if IsCKeywords(inFile) is True: inFile = '%s_' %inFile.upper() return inFile
print로 실행하는 경우 생성CArrayName('1a$if1# 1_4.txt') , 입력 매개변수 문자열은 __1a_if1_1_4_txt로 변환됩니다. 마찬가지로 _Bool은 _BOOL_로 변환됩니다.
Linux 명령 스타일을 최대한 시뮬레이션하려면 명령줄 옵션과 매개변수를 제공해야 합니다. 구문 분석 모듈은 optionparser를 사용합니다. 사용법에 대한 자세한 내용은 Python 명령줄 구문 분석을 참조하세요. xxd -i-like 함수의 명령줄 구현은 다음과 같습니다.
#def ParseOption(base, cols, strip, inFile, outFile): def ParseOption(base = 16, cols = 12, strip = False, inFile = '', outFile = None): from optparse import OptionParser custUsage = '\n xxdi(.py) [options] inFile [outFile]' parser = OptionParser(usage=custUsage) parser.add_option('-b', '--base', dest='base', help='represent values according to BASE(default:16)') parser.add_option('-c', '--column', dest='col', help='COL octets per line(default:12)') parser.add_option('-s', '--strip', action='store_true', dest='strip', help='only output C array elements') (options, args) = parser.parse_args() if options.base is not None: base = int(options.base) if options.col is not None: cols = int(options.col) if options.strip is not None: strip = True if len(args) == 0: print 'No argument, at least one(inFile)!\nUsage:%s' %custUsage if len(args) >= 1: inFile = args[0] if len(args) >= 2: outFile = args[1] return ([base, cols, strip], [inFile, outFile])
주석 처리된 def ParseOption(...)은 원래 다음에서 호출되었습니다. 다음 방법:
base = 16; cols = 12; strip = False; inFile = ''; outFile = '' ([base, cols, strip], [inFile, outFile]) = ParseOption(base, cols, strip, inFile, outFile)
base, cols, Strip 및 기타 매개변수 값을 동시에 수정하려는 의도입니다. 하지만 이런 방식은 매우 어색하므로 호출시에는 ParseOption()만 작성하면 됩니다. 독자들이 더 나은 작성 방법을 알고 있다면 자유롭게 알려주시기 바랍니다.
-h 옵션을 사용하여 명령 프롬프트를 불러오세요. 이는 Linux 스타일과 매우 유사합니다.
E:\PyTest>python xxdi.py -h Usage: xxdi(.py) [options] inFile [outFile] Options: -h, --help show this help message and exit -b BASE, --base=BASE represent values according to BASE(default:16) -c COL, --column=COL COL octets per line(default:12) -s, --strip only output C array elements
위 내용을 바탕으로 연습을 마친 후 이 기사의 주요 내용을 완료하세요.
def Xxdi(): #解析命令行选项及参数 ([base, cols, strip], [inFile, outFile]) = ParseOption() import os if os.path.isfile(inFile) is False: print ''''%s' is not a file!''' %inFile return with open(inFile, 'rb') as file: #必须以'b'模式访问二进制文件 #file = open(inFile, 'rb') #Python2.5以下版本不支持with...as语法 #if True: #不用for line in file或readline(s),以免遇'0x0a'换行 content = file.read() #将文件内容"打散"为字节数组 if base is 16: #Hexadecimal content = map(lambda x: hex(ord(x)), content) elif base is 10: #Decimal content = map(lambda x: str(ord(x)), content) elif base is 8: #Octal content = map(lambda x: oct(ord(x)), content) else: print '[%s]: Invalid base or radix for C language!' %base return #构造数组定义头及长度变量 cArrayName = GenerateCArrayName(inFile) if strip is False: cArrayHeader = 'unsigned char %s[] = {' %cArrayName else: cArrayHeader = '' cArrayTailer = '};\nunsigned int %s_len = %d;' %(cArrayName, len(content)) if strip is True: cArrayTailer = '' #print会在每行输出后自动换行 if outFile is None: print cArrayHeader for i in range(0, len(content), cols): line = ', '.join(content[i:i+cols]) print ' ' + line + ',' print cArrayTailer return with open(outFile, 'w') as file: #file = open(outFile, 'w') #Python2.5以下版本不支持with...as语法 #if True: file.write(cArrayHeader + '\n') for i in range(0, len(content), cols): line = reduce(lambda x,y: ', '.join([x,y]), content[i:i+cols]) file.write(' %s,\n' %line) file.flush() file.write(cArrayTailer)
2.5 이하의 Python 버전은 with...as 구문을 지원하지 않으며 Linux 시스템에서 사용되는 디버깅을 위한 작성자는 Python2.4.3만 설치했습니다. 따라서 Linux 시스템에서 xddi.py를 실행하려면 file = open(....)만 작성할 수 있습니다. 그러나 이를 위해서는 파일 닫기 및 예외 처리가 필요합니다. 자세한 내용은 with...as... 이해를 참조하세요. Python2.5에서 with...as 구문을 사용하는 경우 from __future__ import with_statement를 선언해야 합니다. 예를 들어 platform.python_version()을 통해 Python 버전 번호를 얻을 수 있습니다. :
import platform #判断Python是否为major.minor及以上版本 def IsForwardPyVersion(major, minor): #python_version()返回'major.minor.patchlevel',如'2.7.11' ver = platform.python_version().split('.') if int(ver[0]) >= major and int(ver[1]) >= minor: return True return False
.
Windows 및 Linux 시스템에서 두 번 테스트한 후 Xddi()는 기본적으로 123456789ABCDEF.txt 파일을 가져옵니다(내용은 '123456789ABCDEF). ')를 예로 들어 테스트 결과는 다음과 같습니다.
E:\PyTest>python xxdi.py -c 5 -b 2 -s 123456789ABCDEF.txt [2]: Invalid base or radix for C language! E:\Pytest>python xxdi.py -c 5 -b 10 -s 123456789ABCDEF.txt 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, E:\PyTest>python xxdi.py -c 5 -b 10 123456789ABCDEF.txt unsigned char __123456789ABCDEF_txt[] = { 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, }; unsigned int __123456789ABCDEF_txt_len = 15; E:\PyTest>python xxdi.py -c 5 -b 8 123456789ABCDEF.txt unsigned char __123456789ABCDEF_txt[] = { 061, 062, 063, 064, 065, 066, 067, 070, 071, 0101, 0102, 0103, 0104, 0105, 0106, }; unsigned int __123456789ABCDEF_txt_len = 15; E:\PyTest>python xxdi.py 123456789ABCDEF.txt unsigned char __123456789ABCDEF_txt[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, }; unsigned int __123456789ABCDEF_txt_len = 15;
python xxdi.py VdslBooter를 실행한 후 조금 더 큰 보조 파일을 예로 들어 보겠습니다. bin booter.c, booter.c 파일의 내용은 다음과 같습니다(시작과 끝이 차단됨):
unsigned char VdslBooter_bin[] = { 0xff, 0x31, 0x0, 0xb, 0xff, 0x3, 0x1f, 0x5a, 0x0, 0x0, 0x0, 0x0, //... ... ... ... 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, }; unsigned int VdslBooter_bin_len = 53588;
요약하면 저자가 구현한 xxdi 모듈은 Linux xxd -i의 기능과 매우 유사하며 각각 장단점이 있음을 알 수 있습니다. xxdi의 장점은 배열 이름(키워드 확인)의 유효성을 보다 완벽하게 검증하고 배열 내용(8진수 및 10진수)의 풍부한 표현을 제공한다는 것입니다. 단점은 리디렉션을 지원하지 않으며 값 너비가 고정되지 않는다는 것입니다( 예를 들어 0xb 및 0xff). 물론 이러한 단점을 제거하는 것은 어렵지 않습니다. 예를 들어, 출력 비트 폭을 제어하려면 hex(val) 대신 '0x%02x'%val을 사용하십시오. 그러나 추가적인 개선은 필연적으로 코드의 복잡성을 증가시킬 것이며, 이로 인해 절반의 노력으로 절반의 노력이 필요할 수 있습니다.
위는 편집자가 소개한 Linux 명령 xxd -i 함수의 Python 구현입니다. 모두에게 도움이 되기를 바랍니다!
Linux 명령 xxd -i 기능 소개 및 관련 기사의 더 많은 Python 구현을 보려면 PHP 중국어 웹사이트를 주목하세요!

이 튜토리얼은 Python을 사용하여 Zipf의 법칙의 통계 개념을 처리하는 방법을 보여주고 법을 처리 할 때 Python의 읽기 및 대형 텍스트 파일을 정렬하는 효율성을 보여줍니다. ZIPF 분포라는 용어가 무엇을 의미하는지 궁금 할 것입니다. 이 용어를 이해하려면 먼저 Zipf의 법칙을 정의해야합니다. 걱정하지 마세요. 지침을 단순화하려고 노력할 것입니다. Zipf의 법칙 Zipf의 법칙은 단순히 : 큰 자연어 코퍼스에서 가장 자주 발생하는 단어는 두 번째 빈번한 단어, 세 번째 빈번한 단어보다 세 번, 네 번째 빈번한 단어 등 4 배나 자주 발생합니다. 예를 살펴 보겠습니다. 미국 영어로 브라운 코퍼스를 보면 가장 빈번한 단어는 "TH입니다.

이 기사에서는 HTML을 구문 분석하기 위해 파이썬 라이브러리 인 아름다운 수프를 사용하는 방법을 설명합니다. 데이터 추출, 다양한 HTML 구조 및 오류 처리 및 대안 (SEL과 같은 Find (), find_all (), select () 및 get_text ()와 같은 일반적인 방법을 자세히 설명합니다.

시끄러운 이미지를 다루는 것은 특히 휴대폰 또는 저해상도 카메라 사진에서 일반적인 문제입니다. 이 튜토리얼은 OpenCV를 사용 하여이 문제를 해결하기 위해 Python의 이미지 필터링 기술을 탐구합니다. 이미지 필터링 : 강력한 도구 이미지 필터

데이터 과학 및 처리가 가장 좋아하는 Python은 고성능 컴퓨팅을위한 풍부한 생태계를 제공합니다. 그러나 Python의 병렬 프로그래밍은 독특한 과제를 제시합니다. 이 튜토리얼은 이러한 과제를 탐구하며 전 세계 해석에 중점을 둡니다.

이 기사는 딥 러닝을 위해 텐서 플로와 Pytorch를 비교합니다. 데이터 준비, 모델 구축, 교육, 평가 및 배포와 관련된 단계에 대해 자세히 설명합니다. 프레임 워크, 특히 계산 포도와 관련하여 주요 차이점

이 튜토리얼은 Python 3에서 사용자 정의 파이프 라인 데이터 구조를 작성하여 클래스 및 작업자 과부하를 활용하여 향상된 기능을 보여줍니다. 파이프 라인의 유연성은 일련의 기능을 데이터 세트, GE에 적용하는 능력에 있습니다.

파이썬 객체의 직렬화 및 사막화는 사소한 프로그램의 주요 측면입니다. 무언가를 Python 파일에 저장하면 구성 파일을 읽거나 HTTP 요청에 응답하는 경우 객체 직렬화 및 사태화를 수행합니다. 어떤 의미에서, 직렬화와 사제화는 세계에서 가장 지루한 것들입니다. 이 모든 형식과 프로토콜에 대해 누가 걱정합니까? 일부 파이썬 객체를 지속하거나 스트리밍하여 나중에 완전히 검색하려고합니다. 이것은 세상을 개념적 차원에서 볼 수있는 좋은 방법입니다. 그러나 실제 수준에서 선택한 직렬화 체계, 형식 또는 프로토콜은 속도, 보안, 유지 보수 상태 및 프로그램의 기타 측면을 결정할 수 있습니다.

Python의 통계 모듈은 강력한 데이터 통계 분석 기능을 제공하여 생물 통계 및 비즈니스 분석과 같은 데이터의 전반적인 특성을 빠르게 이해할 수 있도록 도와줍니다. 데이터 포인트를 하나씩 보는 대신 평균 또는 분산과 같은 통계를보고 무시할 수있는 원래 데이터에서 트렌드와 기능을 발견하고 대형 데이터 세트를보다 쉽고 효과적으로 비교하십시오. 이 튜토리얼은 평균을 계산하고 데이터 세트의 분산 정도를 측정하는 방법을 설명합니다. 달리 명시되지 않는 한,이 모듈의 모든 함수는 단순히 평균을 합산하는 대신 평균 () 함수의 계산을 지원합니다. 부동 소수점 번호도 사용할 수 있습니다. 무작위로 가져옵니다 수입 통계 Fracti에서


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

Dreamweaver Mac版
시각적 웹 개발 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는
