2009-03-06 8 views
2

나는이 같은 16 진수 문자열을 증가하기 위해 노력하고있어 :증가의 16 진수 문자열

 
#$67#$1c#$87#$b1; 
#$67#$1c#$87#$b2; 
#$67#$1c#$87#$b3; 

여기 내 절차입니다 :

var test : array [0..3] of char; intSequence : cardinal; 

Sequence := #$67#$1c#$87#$b1; 

procedure IncSequence; 
begin 
    move(Sequence[1],intSequence,SizeOF(Sequence)); 
    inc(intSequence); 
    move(intSequence,Sequence[1],SizeOf(test)); 
end; 

이 절차 파크 만 번째 바이트 증가합니다. 결과는 다음과 같습니다

 
#$67#$1D#$87#$B1 
#$67#$1E#$87#$B1 
#$67#$1F#$87#$B1 

감사

답변

1

당신이, 당신이 뭔가를해야 순서를 증가하려면 :

move(Sequence[0], intSequence, SizeOf(Cardinal)); 
inc(intSequence); 
move(intSequence, Sequence[0], SizeOf(Cardinal)); 

귀하의 코드가 작동하지 않는 순서 [1] 점 때문에 시퀀스의 두 번째 바이트 (배열은 0으로 시작 함)에 저장되며 시퀀스와 테스트는 모두 바이트/문자로 구성되므로 1 바이트 만 전송됩니다.

EDIT : 이것을 시도한 후에 intSequence가 "역방향"바이트 순서로 저장된다는 것을 알았습니다.이 순서는 Sequence의 첫 번째 바이트를 증가시키기 때문에 아마도 전에 Sequence를 반대로하고 싶을 것입니다.

1

현재 세 가지 문제가 있습니다

  1. 인 SizeOf (순서) 시퀀스의 길이 아니다.
  2. 시퀀스 유형을 [0..3]으로 정의 했으므로 인덱스를 0
  3. 엔디안 문제로 시작해야합니다. 당신이 바로 인덱스 및 길이를 할 수 있습니다 경우에도 리틀 엔디안 시스템에서, 당신은이 문제에 대한 솔루션의 #$67#$1c#$87#$b1 #$68#$1c#$87#$b1 #$69#$1c#$87#$b1 ...를 얻을 볼 수 this article
+0

처음에는 문자열을 사용하고 char 배열에 대한 배열 오프셋을 변경하지 않았습니다. 그냥 실수 야. 내 주요한 문제는 엔디안 - 네스였다. 나는 당신의 기사를 따라 왔고 모든 것이 훌륭하게 작동합니다. 감사! – user74899

7

당신은 또한 "변종 기록"을 작성하여이 작업을 수행 할 수 있고 단지 Inc(); 이 경우

type 
    testrec = record 
    case Byte of 
     0: (data: array[0..3] of AnsiChar); 
     1: (intSequence: Integer); 
    end; 
var 
    Sequence: testrec; 
begin 
    Sequence.data = #$b1#$87#$1c#$67; // reversed because of "endian-ness" 
    Inc(Sequence.intSequence); 
end; 

데이터 및 intSequence 필드 "오버레이"메모리 서로 그래서 하나 개의 필드에 대한 쓰기는 즉시 다른 반영한다.

+0

IMO 이것은 파스칼 방식입니다! 질식 시키려면 레코드 구문에 괄호가 있어야합니다. 0 :(데이터 : AnsiChar의 배열 [0..3]); 1 : (intSequence : 정수); 엔디안 게임 때문에 시퀀스가 ​​반대로되어야합니다 : Sequence.data : = # $ b1 # $ 87 # $ 1C# $ 67; showmessage (Format ('% x', [sequence.intsequence])); –

+0

좋은 지적. 나는 그 대답을 편집했다. –

+0

다음과 같이 할 수 있습니다 : Sequence.data : = # $ 67 # $ 1D # $ 87 # $ B1 {되돌릴 수 없음}; Sequence.intSequence : = ntohl (Sequence.intSequence); Winsock 단위에서 찾을 수 있습니다. 추가적인 이점은 코드가 단지 리빌드만으로 비 - 리틀 엔디안 프로세서에서 작동한다는 것입니다. –

1

경고,하지 델파이 전문가

는 문자열 조작을하지 말고 정수의 배열을 사용하지 마십시오.

원하는 것은 숫자를 증가시키는 것입니다. 그렇게하십시오! 16 진수는 정수 배열이 아닌 단일 정수를 나타냅니다. 진수 문자열

  • 증가 정수
  • 변환 정수를 정수로

    1. 변환 진수 문자열이 비효율적 인 나에게 불평하지 마십시오, 그것은 올바른 간단하고 분명하다. 그것이 바로 코드입니다.

      16 진수 문자열이 너무 커서 정수에 적합하지 않은 경우 정수 배열을 사용하여 캡슐화하여 하나의 유형을 처리하는 것처럼 보이게하십시오.그런 다음 정수의 배열이 입력 테스트 할 수 있습니다 별도로

  • 1

    내가 정말 여기에 무슨 일이 일어나고 있는지 볼 생각 :

    난이 델파이 2009 년 숯불 실제로 바이트 변수 인 UnicodeChar입니다 생각합니다.

    4 번째 바이트를 증가시키고 무엇을 변경하고 있습니까? 두 번째 문자의 하위 바이트 - 정확히 표시된 출력을 생성합니다. 당신이 $ FF를 지나치게 감쌌다면 당신은 매우 다른 결과를 보았을 것입니다!

    죄송합니다. 더 많은 정보를 제공해 드릴 수 없습니다. 아직 업그레이드하지 않았습니다.