2013-05-30 1 views
-1

나는 Ruby에서 프로젝트를 진행하고 있습니다. 사용중인 라이브러리는 큰 따옴표로 묶인 문자열을 반환합니다 (예 : "\x00\x40"). 문자열은 큰 따옴표로 묶여 있기 때문에 ASCII 문자로 변환 할 수있는 모든 16 진수가 변환됩니다. 따라서 인쇄 할 때 실제로 : "\[email protected]"이 표시됩니다.더블 쿼트를 싱글로 변경

작은 따옴표를 사용하면 문자열이 순수한 16 진수 (변환없이)로 인쇄된다는 것을 알았습니다. 이것이 내가 원하는 것입니다. 큰 따옴표 붙은 문자열을 작은 따옴표로 변경하려면 어떻게합니까?

C 확장자이기 때문에 라이브러리의 반환 형식을 변경할 수있는 방법이 없으며 반환되는 값의 위치를 ​​파악할 수 없습니다. 모든 아이디어 크게 감사드립니다.

+3

이 적용을 string ** litterals **는 소스 코드에서 찾을 수있는 문자열을 의미합니다. 루비 엔진에 의해 파싱되면 모든 문자열이 동일하므로 문제가 이상하게 보입니다. 이스케이프 시퀀스를 반환하려면 큰 따옴표로 묶은 문자열에서 역 슬래시를 이스케이프 처리 할 수도 있습니다. – SirDarius

+0

백 슬래시를 이스케이프 처리하지만 반환 된 데이터로이 작업을 수행 할 수있는 방법이 없습니다. –

+1

질문을 명확하게 이해할만큼 정확하지 않기 때문에 질문을 개선하십시오. 일부 코드가 도움이 될 수도 있습니다. – SirDarius

답변

4

"\x00\x40"'\x00\x40'은 완전히 다른 문자열을 생성합니다.

"\x00\x40".length 
# => 2 

"\x00\x40".chars.to_a 
# => ["\u0000", "@"] 

'\x00\x40' 8 개 문자가있는 문자열을 생성합니다 : 헥스 0x000x40 값으로

"\x00\x40"은 2 바이트 문자열을 생성 이것은 루비의 파서에 의해 수행되는

'\x00\x40'.length 
# => 8 

'\x00\x40'.chars.to_a 
# => ["\\", "x", "0", "0", "\\", "x", "4", "0"] 

는 당신은 변경할 수 없습니다 문자열이 생성되면

문자열을 16 진수로 변환 할 수 있습니다.

hex = "\x00\x40".unpack("H*")[0] 
# => "0040" 

String#gsub이 추가/\x마다 2 바이트 삽입 :

String#unpack

는 문자열로 각 바이트의 16 진수 값을 반환 즉, 16 진수 문자열로 문자열을 디코딩

hex.gsub(/../) { |s| '\x' + s } 
# => "\\x00\\x40" 
+0

정말 대단한 감사입니다 :) –

+0

우수 답변! 내 질문은 - 여기서 어떻게 성취합니까? :) 정말 자랑스럽게 생각합니다. 나는이 대답을 볼 때까지 결코 그런 차이를 생각하지 못했습니다. –