2014-06-12 2 views
1

다음 작업을 수행하려고하지만 "액세스 위반"오류가 발생합니다.바이트 배열과 같은 문자열에 액세스하는 방법은 무엇입니까?

type Bin = array of byte; 

var s:string; 

begin 
s:='some string'; 
Bin(s)[3]:=ord('X'); 
caption:=s; 
end; 

왜 작동하지 않습니까?

+0

왜 하시겠습니까? 단순히's [3]'에 직접 접근 할 수 있습니다 - 여기에'byte of array '는 필요 없습니다. –

+0

당신이하려고하는 것을 알기가 어렵습니다. 적어도 우리는 문자열이 무엇인지 모르기 때문입니다. UnicodeString 또는 AnsiString? –

+0

@SertacAkyuz, 예 var "s"는 로컬입니다. @KenWhite, char (char)를'ord()'함수로 byte로 변환하고'chr()'함수로 char로 변환 할 필요없이 문자열의 바이트 (encription 알고리즘)로 몇 가지 작업을하고 싶습니다. @DavidHeffernan, AnsiString입니다. –

답변

6

AnsiString 및 동적 바이트 배열이 호환되지 않는 형식이므로이 방법은 작동하지 않습니다. 캐스트가 유효하지 않으며 모든 일이 발생할 수 있습니다.

문자열이 리터럴입니다. 컴파일러는 문자열을 읽기 전용 메모리에 저장하여 처리합니다. 따라서 당신이 그 뒤를 쫓을 때 액세스 위반.

해결 방법은 간단합니다. 직접 문자열에 [] 색인 연산자를 사용하여이 작업을 수행 할 때

s[i] := ...; 

는, 컴파일러는 문자열이 읽기 전용되어, 복사를 당신이 그것을 수정할 수 있도록 메모리를 쓰기 가능을 알고있다.

ord()chr()을 사용하고 싶지 않다고 말합니다. 나는 이유를 모른다. 그것들은 사용하는 올바른 것들이며, 마치 코드가 방출되는 것처럼 보이지 않습니다. 그것들은 intelinsics이며 no-ops가됩니다.

암호화 알고리즘을 코딩한다는 의견을 표합니다. 이것은 당신의 접근 방식의 근본적인 결함을 지적합니다. 암호화 알고리즘은 바이트 배열에서 작동합니다. 암호화 코드에 텍스트를 입력하지 마십시오. 잘 정의 된 텍스트 인코딩을 사용하여 바이트 배열로 변환하십시오. 바이트 배열을 처리합니다. 그리고 바퀴를 재발 명하지 마십시오. 기존 암호화 라이브러리를 사용하십시오.

+0

내가 corectly 이해하는지 말해주십시오. 당신은'ord()'와'chr()'은 정상적인 함수가 아니며 그때 생성 된 코드가 없다고 말했습니까? 나는 그것들을 많이 사용해야하기 때문에 프로그램을 늦추지 않을까 걱정됩니다. –

+2

그들은 intrinsics이고 no-ops로 쓰여질 수 있기 때문에 기대됩니다. 그러나 당신은 그 요점을 놓치고 있습니다. 문자열을 암호화 용 데이터 유형으로 사용하지 않습니다. 바이트 배열을 암호화하십시오. 그것이 시작과 끝입니다. 그리고 당신이 성능에 신경을 쓰면 추측하지 마십시오. 법안. –

관련 문제