2013-10-24 71 views
1

通過將字節與0x80進行或運算,我發送的字節總是小於127,並向客戶端發送1位標誌。JavaScript - 來自整數的負數字節

在客戶端,在JavaScript中,我有一個表示消息字節數的Array()(是的,它可能是愚蠢的,但我還沒有想出類型化數組)。

一切工作正常,直到我擊中最低字節集的最高位的數字。

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


Stored as 
integer in ??? 
JavaScript 

我怎樣才能找回原來的字節(設置爲0的最高位),再加上標誌(由最高位的數值表示)?

例:

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

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

我如何獲得90回來?

編輯 - 我發現這是由於我的代碼中的另一個bug ......我不會瘋狂與編碼...對不起...所有

+0

對不起,沒有完全理解這個問題。我是否正確地認爲你只是試圖將單個字節「拆分」爲7位值和1位值? – freefaller

+0

是的,但它不再是一個字節,它是某種JavaScript編號。與0x80異或仍導致負數。 – 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

我沒有看到問題。

下面是一些代碼,我已經寫了測試,與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"); 

這是給想要的結果...

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

UPDATE基礎上額外的細節提供的OP

我覺得這個我可能是由於javascript中的整數被保存爲32位或64位值......所以當你通過-38傳遞給javascript時,它不會像服務器上的單字節一樣被保存。

您需要在-38轉化成8個字節......

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

這應該給你90值的工作。下面是一個updated JSFiddle

0

嘗試以下JavaScript中:

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

這應該解決您的問題。

說明:存儲在double-precision floating point format在JavaScript所有的數字:

位運算符卻無法處理浮點數。因此他們將它們的操作數轉換爲32位有符號整數。 [source]

-38 = 11111111 11111111 11111111 11011010 

因此,如果你這樣做,你-38^0x80得到錯誤的答案,因爲只有從右邊的第8位被設置爲0。您需要首先將-38限制爲8位,然後使用0x80進行着色。只需要最低有效字節(即11011010)。因此我們做-38 & 0xFF以獲得最低有效字節。

既然你有正確的字節,你可以簡單地與0x80異或。

TLDR:使用byte & 0xFF^0x80