Version 1.3-rc.1 (#138)
* Minor improvements to the handling of landing gear by the SetGear and HandlePOSI functions * sendPOSI command change (double for lat/lon/h) (#111) * Updated POSI to use doubles for lat/lon/alt, as step size for floats was unacceptably large at high longitudes. * Updated Java library for MATLAB, updated Java project, and updated Windows plugin binaries * Rolled back Java version to 1.7 for MATLAB compatibility * Update MessageHandlers.cpp * Update DataManager.cpp * Added pause functionality for individual a/c Adds new cases such that: 0: Unpauses all a/c 1: Pauses all a/c 2: Switches case for all a/c 100:119: Pauses a/c 0:19 200:219: Unpauses a/c 0:19 Updates log messages. Keeps the 0,1,2 arguments as they previously were. * Finished individual pause functionality * Update DataManager.cpp * Updated flags to allow for individual pause commands * Individual pause command documentation * Updated flags to allow for individual pause commands * Adding individual pause to documentation * Updated flags to allow for individual pause commands * Requested changes, cleaning * Update CMakeLists.txt Include "-fno-stack-protector" for linking and compiling for systems that do not have this have this flag as a default. * Enabling AI after setting position (#118) Previously, the code enabled the AI before setting the position of a/c, which negated its purpose. * Updated XPlane SDK to version 2.1.3 * Resolve function ambiguity for std::abs on mac Fixes #126 * Update copyright notice * Update Windows binaries * Update Linux binaries * Update version numbers * fix osx abs ambiguity (#142) * fix indexing error (#143) * Runway camera location control (#144) * update ignore * basics working * set cam pos remotely * log cam position * keep default behaviour, if short view message is received Compatibility with existing software * all to tabs * rename variable * option to use camera direction fields * Added UDP multicast for plugin discovery (#153) * Added Timer * Added UDPSocket::GetAddr * Added MessageHandlers::SendBeacon() * PoC of starting a timer on PluginEnable * C++11 * Added Timer to xcode project * C++11 in cmake * added Timer to cmake * use function pointer in Timer * moved Timer to namespace + wait for thread to join when stopping the timer * Windows: changed uint to unisgned short * Windows: Added Timer.h/cpp to project * GetAddr static * Send xplane and plugin version with BECN * SendBeacon with params * fixed file copyrights * Include functional to fix Linux compile error * review fixes * Send plugin receive port in BECN * review fixes * Fixed tabs vs spaces indentations (#157) * Java client BECN implementation (#155) * Added MS Azure Dev Ops CI integration (#162) * Do not build for i386 on macOS Use ARCHS_STANDARD to avoid the error “The i386 architecture is deprecated. You should update your ARCHS build setting to remove the i386 architecture.” * Fixed missing include The Visual Studio solution was not compiling * Fixed isnan ambigious refernce Ambigious reference when compiling on travis https://stackoverflow.com/questions/33770374/why-is-isnan-ambiguous-and-how-to-avoid-it * Set MSVC warning level to 3 Too many warnings were generated when building a Release build making Travis job to fail because of too much output * Use default toolset for Visual Studio AppVeyor recommends to set the default toolset * #include <cstdint> * Use MSVC ToolsVersion="14.0" # Conflicts: # xpcPlugin/xpcPlugin/xpcPlugin.vcxproj * Removed binaries from repository # Conflicts: # xpcPlugin/XPlaneConnect/64/win.xpl # xpcPlugin/XPlaneConnect/win.xpl * Added ms azure ci xcode linux linux + macos linux + macos removed branch filter win tests win tests Test all platfroms artifacts tests * output all binaries to ‘XPlaneConnect’ All platforms produce a binary in xpcPlugin/XPlaneConnect/ xpcPlugin/XPlaneConnect/64/ * Added ms azure GH deploy deploy stage GH release test trigger tags * Clean up yml file - Added variables - Added job decriptions * Ignore script to ignore .exp files + fixed output path * Renamed ms azure GH connection * Update service connection for azure pipeline * Added Python3 compatible xpc client. (#156) * Update Azure Pipelines service connection
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef CTRLTESTS_H
|
||||
#define CTRLTESTS_H
|
||||
@@ -23,7 +23,7 @@ int doCTRLTest(XPCSocket *sock, char* drefs[7], float values[], int size, int ac
|
||||
{
|
||||
result = getDREFs(*sock, drefs, data, 7, sizes);
|
||||
}
|
||||
|
||||
|
||||
if (result < 0)
|
||||
{
|
||||
return -1;
|
||||
@@ -102,7 +102,7 @@ int basicCTRLTest(char** drefs, int ac)
|
||||
CTRL[4] = -998;
|
||||
CTRL[5] = -998;
|
||||
result = doCTRLTest(&sock, drefs, CTRL, 6, ac, expected);
|
||||
|
||||
|
||||
pauseSim(sock, 0);
|
||||
closeUDP(sock);
|
||||
if (result < 0)
|
||||
@@ -200,4 +200,4 @@ int testGETC_NonPlayer()
|
||||
float CTRL[7] = { 0.0F, 0.0F, 0.0F, 0.8F, 1.0F, 0.5F, -1.5F };
|
||||
return doGETCTest(CTRL, 2, CTRL);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef DATATESTS_H
|
||||
#define DATATESTS_H
|
||||
@@ -59,4 +59,4 @@ int testDATA()
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef DREFTESTS_H
|
||||
#define DREFTESTS_H
|
||||
@@ -244,4 +244,4 @@ int testDREF()
|
||||
return doDREFTest(drefs, values, expected, 6, sizes);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef POSITESTS_H
|
||||
#define POSITESTS_H
|
||||
@@ -6,7 +6,7 @@
|
||||
#include "Test.h"
|
||||
#include "xplaneConnect.h"
|
||||
|
||||
int doPOSITest(char* drefs[7], float values[], int size, int ac, float expected[7])
|
||||
int doPOSITest(char* drefs[7], double values[], int size, int ac, double expected[7])
|
||||
{
|
||||
float* data[7];
|
||||
int sizes[7];
|
||||
@@ -32,15 +32,15 @@ int doPOSITest(char* drefs[7], float values[], int size, int ac, float expected[
|
||||
}
|
||||
|
||||
// Test values
|
||||
float actual[7];
|
||||
double actual[7];
|
||||
for (int i = 0; i < 7; ++i)
|
||||
{
|
||||
actual[i] = data[i][0];
|
||||
}
|
||||
return compareArray(expected, actual, 7);
|
||||
return compareDoubleArray(expected, actual, 7);
|
||||
}
|
||||
|
||||
int doGETPTest(float values[7], int ac, float expected[7])
|
||||
int doGETPTest(double values[7], int ac, double expected[7])
|
||||
{
|
||||
// Execute Test
|
||||
float actual[7];
|
||||
@@ -70,8 +70,8 @@ int doGETPTest(float values[7], int ac, float expected[7])
|
||||
int basicPOSITest(char** drefs, int ac)
|
||||
{
|
||||
// Set psoition and initial orientation
|
||||
float POSI[7] = { 37.524F, -122.06899F, 2500, 0, 0, 0, 1 };
|
||||
float expected[7] = { 37.524F, -122.06899F, 2500, 0, 0, 0, 1 };
|
||||
double POSI[7] = { 37.524, -122.06899, 2500, 0, 0, 0, 1 };
|
||||
double expected[7] = { 37.524, -122.06899, 2500, 0, 0, 0, 1 };
|
||||
int result = doPOSITest(drefs, POSI, 7, ac, expected);
|
||||
if (result < 0)
|
||||
{
|
||||
@@ -79,9 +79,9 @@ int basicPOSITest(char** drefs, int ac)
|
||||
}
|
||||
|
||||
// Set orientation
|
||||
POSI[0] = -998.0F;
|
||||
POSI[1] = -998.0F;
|
||||
POSI[2] = -998.0F;
|
||||
POSI[0] = -998.0;
|
||||
POSI[1] = -998.0;
|
||||
POSI[2] = -998.0;
|
||||
POSI[3] = 5.0F;
|
||||
POSI[4] = -5.0F;
|
||||
POSI[5] = 10.0F;
|
||||
@@ -101,10 +101,10 @@ int basicPOSITest(char** drefs, int ac)
|
||||
expected[0] = loc[0][0];
|
||||
expected[1] = loc[1][0];
|
||||
expected[2] = loc[2][0];
|
||||
expected[3] = 5.0F;
|
||||
expected[4] = -5.0F;
|
||||
expected[5] = 10.0F;
|
||||
expected[6] = 0.0F;
|
||||
expected[3] = 5.0;
|
||||
expected[4] = -5.0;
|
||||
expected[5] = 10.0;
|
||||
expected[6] = 0.0;
|
||||
result = doPOSITest(drefs, POSI, 7, ac, expected);
|
||||
if (result < 0)
|
||||
{
|
||||
@@ -145,14 +145,14 @@ int testPOSI_NonPlayer()
|
||||
|
||||
int testGetPOSI_Player()
|
||||
{
|
||||
float POSI[7] = { 37.524F, -122.06899F, 2500, 0, 0, 0, 1 };
|
||||
double POSI[7] = { 37.524, -122.06899, 2500, 0, 0, 0, 1 };
|
||||
return doGETPTest(POSI, 0, POSI);
|
||||
}
|
||||
|
||||
int testGetPOSI_NonPlayer()
|
||||
{
|
||||
float POSI[7] = { 37.624F, -122.06899F, 1500, 0, 0, 0, 1 };
|
||||
double POSI[7] = { 37.624, -122.06899, 1500, 0, 0, 0, 1 };
|
||||
return doGETPTest(POSI, 3, POSI);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef SIMUTESTS_H
|
||||
#define SIMIUTESTS_H
|
||||
@@ -16,7 +16,7 @@ int doSIMUTest(int value, float expected)
|
||||
int result = pauseSim(sock, value);
|
||||
if (result >= 0)
|
||||
{
|
||||
result = getDREF(sock, dref, &actual, &size);
|
||||
result = getDREF(sock, dref, actual, &size);
|
||||
}
|
||||
closeUDP(sock);
|
||||
if (result < 0)
|
||||
@@ -78,4 +78,4 @@ int testSIMU_Toggle()
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#include "Test.h"
|
||||
|
||||
@@ -56,4 +56,28 @@ int compareArrays(float* expected[], int esizes[], float* actual[], int asizes[]
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
int compareDoubleArray(double expected[], double actual[], int size)
|
||||
{
|
||||
return compareDoubleArrays(&expected, &size, &actual, &size, 1);
|
||||
}
|
||||
|
||||
int compareDoubleArrays(double* expected[], int esizes[], double* actual[], int asizes[], int count)
|
||||
{
|
||||
for (int i = 0; i < count; ++i)
|
||||
{
|
||||
if (esizes[i] != asizes[i])
|
||||
{
|
||||
return -100 - i;
|
||||
}
|
||||
for (int j = 0; j < esizes[i]; ++j)
|
||||
{
|
||||
if (!feq(actual[i][j], expected[i][j]) && !isnan(expected[i][j]))
|
||||
{
|
||||
return -1000 - i * 100 - j;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef TESTRUNNER_H
|
||||
#define TESTRUNNER_H
|
||||
@@ -33,5 +33,7 @@ void runTest(int(*test)(), char* name);
|
||||
int compareFloat(float expected, float actual);
|
||||
int compareArray(float expected[], float actual[], int size);
|
||||
int compareArrays(float* expected[], int esizes[], float* actual[], int asizes[], int count);
|
||||
int compareDoubleArray(double expected[], double actual[], int size);
|
||||
int compareDoubleArrays(double* expected[], int esizes[], double* actual[], int asizes[], int count);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef TEXTTESTS_H
|
||||
#define TEXTTESTS_H
|
||||
@@ -29,4 +29,4 @@ int testTEXT()
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef UDPTESTS_H
|
||||
#define UDPTESTS_H
|
||||
@@ -52,4 +52,4 @@ int testCONN()
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef VIEWTESTS_H
|
||||
#define VIEWTESTS_H
|
||||
@@ -70,4 +70,4 @@ int testView()
|
||||
|
||||
return doViewTest(XPC_VIEW_CHASE, XPC_VDREF_CHASE);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef WYPTTESTS_H
|
||||
#define WYPTTESTS_H
|
||||
@@ -39,4 +39,4 @@ int testWYPT()
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//Copyright (c) 2013-2018 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#include "Test.h"
|
||||
#include "UDPTests.h"
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
int main(int argc, const char * argv[]) {
|
||||
printf("XPC Tests-c ");
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
printf("(Windows)\n");
|
||||
#elif (__APPLE__)
|
||||
@@ -23,7 +23,7 @@ int main(int argc, const char * argv[]) {
|
||||
#else
|
||||
printf("(Unable to determine operating system) \n")
|
||||
#endif
|
||||
|
||||
|
||||
// Basic Networking
|
||||
runTest(testOpen, "open");
|
||||
crossPlatformUSleep(SLEEP_AMOUNT);
|
||||
@@ -78,11 +78,10 @@ int main(int argc, const char * argv[]) {
|
||||
// setConn
|
||||
crossPlatformUSleep(SLEEP_AMOUNT);
|
||||
runTest(testCONN, "CONN");
|
||||
|
||||
|
||||
printf( "----------------\nTest Summary\n\tFailed: %i\n\tPassed: %i\n", testFailed, testPassed );
|
||||
printf("Press any key to exit.");
|
||||
getchar();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -542,15 +542,15 @@ public class XPlaneConnectTest
|
||||
public void testSendPOSI() throws IOException
|
||||
{
|
||||
String[] drefs = {
|
||||
"sim/flightmodel/position/latitude",
|
||||
"sim/flightmodel/position/longitude",
|
||||
"sim/flightmodel/position/y_agl",
|
||||
"sim/flightmodel/position/phi",
|
||||
"sim/flightmodel/position/theta",
|
||||
"sim/flightmodel/position/psi",
|
||||
"sim/cockpit/switches/gear_handle_status"
|
||||
"sim/flightmodel/position/latitude",
|
||||
"sim/flightmodel/position/longitude",
|
||||
"sim/flightmodel/position/y_agl",
|
||||
"sim/flightmodel/position/phi",
|
||||
"sim/flightmodel/position/theta",
|
||||
"sim/flightmodel/position/psi",
|
||||
"sim/cockpit/switches/gear_handle_status"
|
||||
};
|
||||
float[] posi = new float[] {37.524F, -122.06899F, 2500, 0, 0, 0, 1};
|
||||
double[] posi = new double[] {37.524, -122.06899, 2500, 0, 0, 0, 1};
|
||||
try(XPlaneConnect xpc = new XPlaneConnect())
|
||||
{
|
||||
xpc.pauseSim(true);
|
||||
@@ -585,7 +585,7 @@ public class XPlaneConnectTest
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testSendPOSI_LongCtrl() throws IOException
|
||||
{
|
||||
float[] posi = new float[] {37.524F, -122.06899F, 2500, 0, 0, 0, 1, -998};
|
||||
double[] posi = new double[] {37.524, -122.06899, 2500, 0, 0, 0, 1, -998};
|
||||
try(XPlaneConnect xpc = new XPlaneConnect())
|
||||
{
|
||||
xpc.sendPOSI(posi);
|
||||
@@ -595,7 +595,7 @@ public class XPlaneConnectTest
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testSendPOSI_NegativeAircraftNum() throws IOException
|
||||
{
|
||||
float[] posi = new float[] {37.524F, -122.06899F, 2500, 0, 0, 0, 1, -998};
|
||||
double[] posi = new double[] {37.524, -122.06899, 2500, 0, 0, 0, 1, -998};
|
||||
try(XPlaneConnect xpc = new XPlaneConnect())
|
||||
{
|
||||
xpc.sendPOSI(posi, -1);
|
||||
@@ -605,7 +605,7 @@ public class XPlaneConnectTest
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testSendPOSI_LargeAircraftNum() throws IOException
|
||||
{
|
||||
float[] posi = new float[] {37.524F, -122.06899F, 2500, 0, 0, 0, 1, -998};
|
||||
double[] posi = new double[] {37.524, -122.06899, 2500, 0, 0, 0, 1, -998};
|
||||
try(XPlaneConnect xpc = new XPlaneConnect())
|
||||
{
|
||||
xpc.sendPOSI(posi, 300);
|
||||
@@ -702,12 +702,12 @@ public class XPlaneConnectTest
|
||||
@Test
|
||||
public void testGetPOSI() throws IOException
|
||||
{
|
||||
float[] values = { 37.524F, -122.06899F, 2500.0F, 45.0F, -45.0F, 15.0F, 1.0F };
|
||||
double[] values = { 37.524, -122.06899, 2500.0, 45.0, -45.0, 15.0, 1.0 };
|
||||
try(XPlaneConnect xpc = new XPlaneConnect())
|
||||
{
|
||||
xpc.pauseSim(true);
|
||||
xpc.sendPOSI(values);
|
||||
float[] actual = xpc.getPOSI(0);
|
||||
double[] actual = xpc.getPOSI(0);
|
||||
|
||||
assertArrayEquals(values, actual, 1e-4F);
|
||||
}
|
||||
@@ -725,4 +725,4 @@ public class XPlaneConnectTest
|
||||
assertArrayEquals(values, actual, 1e-4F);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
73
TestScripts/Java Tests/XPlaneDiscoveryTests.java
Normal file
73
TestScripts/Java Tests/XPlaneDiscoveryTests.java
Normal file
@@ -0,0 +1,73 @@
|
||||
package gov.nasa.xpc.test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
import gov.nasa.xpc.discovery.Beacon;
|
||||
import gov.nasa.xpc.discovery.BeaconParser;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.DatagramPacket;
|
||||
|
||||
|
||||
public class XPlaneDiscoveryTests {
|
||||
|
||||
private BeaconParser parser;
|
||||
private DatagramPacket packet;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
parser = new BeaconParser();
|
||||
byte[] bytes = HexHelper.decodeHexString("4245434E0071BFFC2B0000312E332D72632E310000000000000000");
|
||||
packet = new DatagramPacket(bytes, 0, bytes.length);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void readBeaconParsesPort() throws IOException {
|
||||
Beacon beacon = parser.readBCN(packet);
|
||||
assertEquals(beacon.getPluginPort(), 49009);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void readBeaconParsesXplaneVersion() throws IOException {
|
||||
Beacon beacon = parser.readBCN(packet);
|
||||
assertEquals(beacon.getXplaneVersion(), "112.60");
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void readBeaconParsesPluginVersion() throws IOException {
|
||||
Beacon beacon = parser.readBCN(packet);
|
||||
assertEquals(beacon.getPluginVersion(), "1.3-rc.1");
|
||||
}
|
||||
}
|
||||
|
||||
class HexHelper {
|
||||
static byte[] decodeHexString(String hexString) {
|
||||
if (hexString.length() % 2 == 1) {
|
||||
throw new IllegalArgumentException("Invalid hexadecimal String supplied.");
|
||||
}
|
||||
|
||||
byte[] bytes = new byte[hexString.length() / 2];
|
||||
for (int i = 0; i < hexString.length(); i += 2) {
|
||||
bytes[i / 2] = hexToByte(hexString.substring(i, i + 2));
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
private static byte hexToByte(String hexString) {
|
||||
int firstDigit = toDigit(hexString.charAt(0));
|
||||
int secondDigit = toDigit(hexString.charAt(1));
|
||||
return (byte) ((firstDigit << 4) + secondDigit);
|
||||
}
|
||||
|
||||
private static int toDigit(char hexChar) {
|
||||
int digit = Character.digit(hexChar, 16);
|
||||
if (digit == -1) {
|
||||
throw new IllegalArgumentException(
|
||||
"Invalid Hexadecimal Character: " + hexChar);
|
||||
}
|
||||
return digit;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user