मैं OAuth2.0 खेल के मैदान पर अपने बीकन को पंजीकृत करने की कोशिश कर रहा हूं। जब मैं अपने बीकन को पंजीकृत करने की कोशिश कर रहा हूं, तो यह मुझे निम्नलिखित त्रुटि देता है:

{   "error": {
"status": "INVALID_ARGUMENT", 
"message": "Invalid AdvertisedId id bytes length", 
"code": 400   } 
}

मैं application/json निम्नलिखित के साथ {{एक्स 1}} अनुरोध {{एक्स 1}} भेज रहा हूं:

 {
  "advertisedId": {
    "type": "EDDYSTONE",
    "id": "ZWRkMWViXWFjMDRlNWRlZmEwNTdkMGU3ZDAwMmQ4YmM="
  },
  "status": "ACTIVE",
}

मैं इसके द्वारा बीकन के advertiseID की गणना कर रहा हूं:

InstanceID: e61bdd5c2a9a

Namespace: edd1ebfac04e5defa017

मैं इस विधि से advertiseId बना रहा हूं:

[1] संगत करें Namespace+Instance। = & Gt; {{ X1 }}

[2] निम्नलिखित कोड का उपयोग करके इसे बाइट स्ट्रीम में बदलें:

byte[] message = "edd1ebfac04e5defa017e61bdd5c2a9a".getBytes(StandardCharsets.UTF_8);

[3] फिर निम्नलिखित कोड का उपयोग करके इसे Base64 में परिवर्तित करें:

String encoded = Base64.getEncoder().encodeToString(message);

अब encoded हमारा advertisedId है जो ZWRkMWViXWFjMDRlNWRlZmEwNTdkMGU3ZDAwMmQ4YmM= है

क्या कोई मेरी मदद कर सकता है?

1
Rajat Gupta 2 पद 2015, 14:21

2 जवाब

सबसे बढ़िया उत्तर

यह बीकन आईडी के लिए हेक्स मूल्यों और इन के लिए वास्तविक अंतर्निहित द्विआधारी मूल्यों के बीच रूपांतरण के साथ एक सामान्य रूप से आम समस्या है।

बेस 64 स्ट्रिंग {{एक्स 0}} वास्तव में टेक्स्ट हेक्स स्ट्रिंग {{एक्स 1}} का बेस 64 एनकोडिंग है। लेकिन वास्तव में आपको जो करने की आवश्यकता है वह है बेस 64 इस हेक्स स्ट्रिंग को अंतर्निहित बाइनरी मान को एन्कोड करता है।

उदाहरण के लिए, Node.jS में:

var b = Buffer("edd1ebfac04e5defa017e61bdd5c2a9a", "hex");
b.length;
> 16 bytes    // The 32 char string above represents 16 bytes!

b.toString("base64");
> '7dHr+sBOXe+gF+Yb3Vwqmg=='
b.toString("base64").length;
> 24

तो, जैसा कि आप देख सकते हैं, आपको एक बेस 64 स्ट्रिंग होना चाहिए जो कि लंबाई में लगभग 24 बाइट्स हो।

इसलिए, आपका रूपांतरण फ़ंक्शन निम्न पंक्तियों के साथ कुछ होना चाहिए:

String convertHexBeaconIDToAdvertisementID(String hex) {
    byte[] bytes = ByteString.decodeHex(hex).toByteArray();
    return Base64.getEncoder().encodeToString(bytes);
}
2
MarcWan 14 पद 2015, 10:18

यदि किसी को जावा में पूर्ण कार्य उदाहरण की आवश्यकता है :),

import java.util.Base64;
import javax.xml.bind.DatatypeConverter;

public class Eddystone{

    public static byte[] toByteArray(String s) {
        return DatatypeConverter.parseHexBinary(s);
    }

    public static String convertHexBeaconIDToAdvertisementID(String hex) {
        byte[] encoded = toByteArray(hex);
        return Base64.getEncoder().encodeToString(encoded);
    }

    public static void main(String[] args){
        System.out.println("Base64 Eddystone AdvertisementID: " + 
            convertHexBeaconIDToAdvertisementID("edd1ebfac04e5defa017e61bdd5c2a9a"));
    }
}
3
ninu 18 जिंदा 2016, 06:57