2017-12-06 38 views
1

확장 ASCII 코드를 부호없는 char에 할당 할 때 값이 파일에 기록 될 때 위쪽으로 이동한다는 것을 알았습니다. 확장 ASCII 코드 이동

나는 잠시 내 질문을 제시하는이 간단한 프로그램으로 내 코드를 응축 :

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    unsigned char testascii[3]; 

    testascii[0] = 122; 
    testascii[1] = 150; 
    testascii[2] = 175; 

    printf("%d\n", testascii[0]); 
    printf("%d\n", testascii[1]); 
    printf("%d\n", testascii[2]); 

    return 0; 
} 

나는이 간단한 프로그램을 실행하면, 나는이 터미널 출력을 얻을 :

122 
150 
175 

이 정확합니다.

FILE *f; 
f = fopen("/mystuff/testascii", "wb"); 
if (f == NULL) 
{ 
    printf("Error opening file\n"); 
    exit(1); 
} 
fwrite(testascii, 1, 3, f); 
fclose(f); 

그것은 제대로 실행하지만 지금은 O/S로 이동하면 실행 :

od -c testascii 

내가이 출력을 얻을 지금 위의 프로그램에 다음을 추가하면

:

0000000 z 226 257 
0000003 

표준 ASCII 코드 (128 미만)가 올바르게 표시됩니다. 그러나 확장 ASCII 코드 (127 이상)는 변경됩니다. 나는 그들이 150과 175가 되길 기대하지만 그들은 226과 257입니다.

파일 열기 명령에서 2 진 플래그를 제거하면 결과는 동일합니다. 최종 검사로서

대신 이진 인쇄 (에 fwrite)의, 다시 코드를 변경하고 배열을 통해 루프와 같은 각 항목의 fprintf를했다 : 여기
fprintf (fp, "%d", appendtxt[i]); 

가에 대한 OD 디스플레이의를 그 :

0000000 1 2 2 1 5 0 1 7 5 
0000011 

이 모든 것은 이진 인쇄 (fwrite)가 예상 한대로 수행되지 않는다는 것을 알려줍니다. fwrite 명령이 이진 데이터를 파일에 쓰는 것을 이해합니다. 이 경우 128보다 작은 값을 성공적으로 작성하지만 128보다 크거나 같은 값으로 실패하는 이유는 무엇입니까?

환경 : 코드 :: 블록 16.01 를 CentOS 7.1

참고 :이 비슷한 질문을 발견했다 : fwrite with non ASCII characters을하지만 내 상황에 도움을 보이지 않았다. 내가 틀렸을 수도있다. 그 게시물에서 뭔가를 놓친다면 알려주시겠습니까?

+3

"od"는 "OCTAL 덤프"를 나타냅니다. 8 진수 226은 150입니다. –

+0

그리고 257은 십진수 바이트 값이 될 수 없습니다. 십진수 175는 8 진수입니다. –

답변

1

8 진수로 인쇄합니다 (기본값은 od입니다). 226 옥타브는 십진수 150입니다.

+0

사용중인 ASCII 테이블에 확장 ASCII에 대한 8 진수가 없습니다. 더 많은 정보를 제공하는 다른 테이블을 찾았습니다. 명확히 해 주셔서 감사합니다. – DrakesDR