2013-10-24 1 views
1

0xFF로 바이트를 OR 연산하여 클라이언트에 1 비트 플래그로 항상 127보다 작은 바이트를 전송합니다.JavaScript - 정수의 음수 바이트

JavaScript에서는 클라이언트 측에서 메시지의 바이트 수를 나타내는 Array() 배열을 사용합니다 (예 : 아마도 바보이지만 입력 된 배열을 아직 알지 못했습니다).

가장 낮은 바이트 세트의 가장 높은 비트로 숫자를 맞추기 전까지는 모든 것이 잘 작동합니다.

Number: 0011 0101 
    flag: 1000 0000 
      --------- 
      1011 0101 


Stored as 
integer in ??? 
JavaScript 
I (0으로 설정 가장 높은 비트) 원래 바이트 플러스 (가장 높은 비트의 값으로 표시) 플래그를 검색 할 수있는 방법

?

:

(server) 
byte x = 90 
x | 0x80 
> -38 

(client - JavaScript) 
var x = -38 
x^0x80 
> -166 

가 어떻게 90 다시받을 수 있나요?

편집 - 난 내가 질문을 이해 확실하지 ... 모든 죄송합니다 ... 인코딩과

+0

죄송합니다. 질문을 완전히 이해하지 못했습니다. 싱글 바이트를 7 비트 값과 1 비트 값으로 "분할"하려고 생각한 것입니까? – freefaller

+0

네, 그렇지만 더 이상 바이트가 아닙니다. 자바 스크립트 번호입니다. 0x80로 XOR하면 여전히 음수가됩니다. – user202987

+1

음수를 생성하는 코드를 표시 할 수 있습니까? 이것은 나를 위해 작동합니다 :'num = parseInt ('10110101', 2)^0x80' 그리고'flag = parseInt ('10110101', 2) & 0x80! == 0' – tjameson

답변

0

을 미친 않을되었다 ... 이것은 내 코드에 또 다른 버그 때문 발견,하지만 난 탄을 줄 것이다 : 당신이 바로 0x80으로 배타적 논리합에 :

var received = 181; // 10110101 
var num = received^0x80; 

console.log(num); // 53, 00110101 

을 다른 결과가있는 경우, 아마 당신의 코드에서 다른 무언가가있다 - 당신은 위의 코드를 실행하면 예상 된 결과를 제공해야합니다.

0

문제가 표시되지 않습니다. 여기

는 추가 세부 정보를 기반

Val: 57 
Flag: 1 
Val With Flag: 185 
New Val Without Flag: 57 
New Val Flag: 1 

... JSFiddle live demo

var val = 57; 
var flag = 1; 

var valWithFlag = val | (flag ? 0x80 : 0); 
var newVal = (valWithFlag & 0x7F); 
var newValFlag = (valWithFlag & 0x80 ? 1 : 0); 

alert("Val: " + val.toString() + "\n" + 
     "Flag: " + flag.toString() + "\n" + 
     "Val With Flag: " + valWithFlag.toString() + "\n" + 
     "New Val Without Flag: " + newVal.toString() + "\n" + 
     "New Val Flag: " + newValFlag.toString() + "\n"); 

그것은 원하는 결과를주고있다으로, UPDATE 내가 시험에 작성한 일부 코드 OP에서 제공

나는 이것을 i라고 생각한다. 아마 32 또는 64 비트 값 중 하나로 개최되는 자바 스크립트의 정수로 인해 ... -38을 통해 자바 스크립트를 통과 할 때 서버의 단일 바이트와 같은 방식으로 유지되지 않습니다.

당신은 ... 8 바이트로 -38 것을 당신과 함께 작동하도록 (90) 값을 제공한다

var val = -38; 
var jsVal = (val & 0xFF); 

변환해야합니다.

var received = -38; 
var adjusted = received & 0xFF; // 218 
var original = adjusted^0x80; // 90 

문제를 해결해야한다는 : 여기에 updated JSFiddle

0

자바 스크립트에 다음을 시도합니다.

설명 : double-precision floating point format에 저장된 자바 스크립트 모든 번호 :

비트 연산자 그러나 부동 소수점 숫자를 처리 할 수 ​​없다. 따라서 피연산자를 32 비트 부호있는 정수로 변환합니다. 당신이 -38^0x80을 할 경우 오른쪽에서 유일한 8 비트가 0로 설정되어 [source]

-38 = 11111111 11111111 11111111 11011010 

따라서 잘못된 답변을 얻을. 먼저 -38을 8 비트로 제한해야합니다. 0x80으로 xoring합니다. 최하위 바이트 (예 : 11011010) 만 필요합니다. 따라서 우리는 최하위 바이트를 얻기 위해 -38 & 0xFF을 수행합니다.

올바른 바이트가 있으므로 0x80으로 간단히 xor 할 수 있습니다.

TLDR : byte & 0xFF^0x80을 사용하십시오.

관련 문제